Basicamente, fmap print (print "Hello World")aplica seu primeiro parâmetro, a printfunção, ao resultado de print "Hello World". Isso é simplesmente o equivalente a invocar print ()após a print "Hello World"ação ser executada.
Redu
@ Redu Isso está correto, mas observe que a invocação de print ()nunca é avaliada, nem sua ação é executada (que seria impressa ()em stdout). Portanto, "invocar print ()após ..." é um pouco enganador (IMO).
chi
Respostas:
21
main :: IO (IO ())
main = print <$>(print "Hello, World!")
é equivalente, graças às leis da mônada, a
main :: IO (IO ())
main =do
result <- print "Hello, World!"
return (print result)
Agora, printsempre retorna ()como resultado, portanto todo o código é equivalente a
main :: IO (IO ())
main =do_<- print "Hello, World!"
return (print ())
Finalmente, o resultado de mainé simplesmente descartado. Ou seja, a última linha pode ser return (putStrLn "this is ignored")e ter o mesmo efeito.
Portanto, o código executará apenas o primeiro print "Hello, World!" .
Eu recomendaria que você sempre definisse main :: IO (). Haskell nos permite declararmain :: IO AnyTypeHere , mas isso é confuso (IMO).
Também recomendo que você use putStrLn, e não printimprima, porque o último citará e escapará de toda a string.
fmap print (print "Hello World")
aplica seu primeiro parâmetro, aprint
função, ao resultado deprint "Hello World"
. Isso é simplesmente o equivalente a invocarprint ()
após aprint "Hello World"
ação ser executada.print ()
nunca é avaliada, nem sua ação é executada (que seria impressa()
em stdout). Portanto, "invocarprint ()
após ..." é um pouco enganador (IMO).Respostas:
é equivalente, graças às leis da mônada, a
Agora,
print
sempre retorna()
como resultado, portanto todo o código é equivalente aFinalmente, o resultado de
main
é simplesmente descartado. Ou seja, a última linha pode serreturn (putStrLn "this is ignored")
e ter o mesmo efeito.Portanto, o código executará apenas o primeiro
print "Hello, World!"
.Eu recomendaria que você sempre definisse
main :: IO ()
. Haskell nos permite declararmain :: IO AnyTypeHere
, mas isso é confuso (IMO).Também recomendo que você use
putStrLn
, e nãoprint
imprima, porque o último citará e escapará de toda a string.fonte
f <$> a ≡ a >>= \r -> return $ f r
não é apenas uma coisa específica para esta situação, mas vale para qualquer mônada.