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 mainviene 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 printdi stampare le stringhe, poiché quest'ultima citerà e sfuggirà all'intera stringa.
fmap print (print "Hello World")applica il suo primo parametro, laprintfunzione, al risultato diprint "Hello World". Questo è semplicemente l'equivalente di invocareprint ()dopo l'print "Hello World"esecuzione dell'azione.