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, print
renvoie 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 main
est 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 putStrLn
et de ne print
pas imprimer de chaînes, car ce dernier cite et échappe la chaîne entière.
fmap print (print "Hello World")
son premier paramètre, laprint
fonction, au résultat deprint "Hello World"
. C'est tout simplement l'équivalent d'invoquer uneprint ()
fois l'print "Hello World"
action effectuée.