main :: IO (IO ())
main = print <$> (print "Hello, World!")
è equivalente, grazie alle leggi della monade, a
main :: IO (IO ())
main = do
result <- print "Hello, World!"
return (print result)
Adesso, print
restituisce sempre ()
come risultato, quindi l'intero codice è equivalente a
main :: IO (IO ())
main = do
_ <- print "Hello, World!"
return (print ())
Infine, il risultato di main
viene semplicemente scartato. Cioè, l'ultima riga potrebbe essere return (putStrLn "this is ignored")
e avere lo stesso effetto.
Quindi il codice eseguirà solo il primo print "Hello, World!"
.
Consiglierei di definire sempre main :: IO ()
. Haskell ci permette di dichiarare main :: IO AnyTypeHere
, ma questo è (IMO) confuso.
Consiglierei anche di usare putStrLn
, e non print
di stampare le stringhe, poiché quest'ultima citerà e sfuggirà all'intera stringa.
fmap print (print "Hello World")
applica il suo primo parametro, laprint
funzione, al risultato diprint "Hello World"
. Questo è semplicemente l'equivalente di invocareprint ()
dopo l'print "Hello World"
esecuzione dell'azione.