main :: IO (IO ())
main = print <$> (print "Hello, World!")
équivaut, grâce aux lois de la monade, à
main :: IO (IO ())
main = do
result <- print "Hello, World!"
return (print result)
Maintenant, printrenvoie toujours ()comme résultat, donc tout le code est équivalent à
main :: IO (IO ())
main = do
_ <- print "Hello, World!"
return (print ())
Enfin, le résultat de mainest simplement rejeté. Autrement dit, la dernière ligne pourrait être return (putStrLn "this is ignored")et avoir le même effet.
Par conséquent, le code n'exécutera que le premier print "Hello, World!".
Je recommanderais que vous définissiez toujours main :: IO (). Haskell nous permet de déclarer main :: IO AnyTypeHere, mais c'est (OMI) déroutant.
Je vous recommande également d'utiliser putStrLnet de ne printpas imprimer de chaînes, car ce dernier cite et échappe la chaîne entière.
fmap print (print "Hello World")son premier paramètre, laprintfonction, au résultat deprint "Hello World". C'est tout simplement l'équivalent d'invoquer uneprint ()fois l'print "Hello World"action effectuée.