Przy obliczaniu IO (IO ())
zarówno (IO ())
i ()
jest obliczane, więc dlaczego
main :: IO (IO ())
main = print <$> (print "Hello, World!")
wydrukować
"Hello, World!"
nie
IO "Hello, World!" -- ??
"Hello, World!"
print ()
nigdy nie jest oceniane, ani wykonywane jest jego działanie (które wypisuje się ()
na standardowe wyjście). Tak więc „wywoływanie print ()
po ...” jest nieco mylące (IMO).
fmap print (print "Hello World")
stosuje swój pierwszy parametr,print
funkcję, do wynikuprint "Hello World"
. Jest to po prostu odpowiednik wywoływaniaprint ()
po wykonaniuprint "Hello World"
akcji.