Mentre gioco con le monadi, spesso ho problemi di valutazione. Ora capisco i concetti di base della valutazione pigra, ma non capisco come le monadi siano pigramente valutate in Haskell.Valutazione Haskell e Lazy Monads
Si consideri il seguente codice
module Main where
import Control.Monad
import Control.Applicative
import System
main = print <$> head <$> getArgs
Nella mia mente si deve la funzione principale dovrebbe stampare il primo argomento della console, ma non è così.
so che
getArgs :: IO [String]
head <$> getArgs :: IO String
print <$> (head <$> getArgs) :: IO (IO())
main :: IO (IO())
così apparentemente, il primo argomento non si stampa sul stdout perché il contenuto della prima Monade IO non viene valutato. Quindi se mi unisco alle due monadi, funziona.
main = join $ print <$> head <$> getArgs
Qualcuno, per favore, chiarirebbe per me? (O darmi un puntatore)
Grazie mille per la risposta esauriente. – Jack
Quindi in pratica quello che ho fatto è stato eseguire getArgs (l'IO esterno) e lanciare i risultati in qualcosa che non è mai stato eseguito (perché ignorato dal main). – Jack
corretto. Il codice esegue 'head <$> getArgs' e quindi invia il risultato a' return. print', che ha il tipo 'a -> IO (IO())'. –