Básicamente fmap print (print "Hello World")aplica su primer parámetro, la printfunción, al resultado de print "Hello World". Eso es simplemente el equivalente a invocar print ()después de realizar una print "Hello World"acción.
Reducido el
@Redu Eso es correcto, pero tenga en cuenta que la invocación de print ()nunca se evalúa, ni se realiza su acción (que se imprimiría ()en stdout). Entonces, "invocar print ()después de ..." es un poco engañoso (IMO).
chi
Respuestas:
21
main :: IO (IO ())
main = print <$>(print "Hello, World!")
es equivalente, gracias a las leyes de mónada, a
main :: IO (IO ())
main =do
result <- print "Hello, World!"
return (print result)
Ahora, printsiempre se devuelve ()como resultado, por lo que todo el código es equivalente a
main :: IO (IO ())
main =do_<- print "Hello, World!"
return (print ())
Finalmente, el resultado de mainsimplemente se descarta. Es decir, la última línea podría ser return (putStrLn "this is ignored")y tener el mismo efecto.
Por lo tanto, el código solo ejecutará el primero print "Hello, World!".
Yo recomendaría que siempre definas main :: IO (). Haskell nos permite declarar main :: IO AnyTypeHere, pero esto es (IMO) confuso.
También recomendaría que use putStrLn, y no printpara imprimir cadenas, ya que este último citará y escapará de toda la cadena.
fmap print (print "Hello World")
aplica su primer parámetro, laprint
función, al resultado deprint "Hello World"
. Eso es simplemente el equivalente a invocarprint ()
después de realizar unaprint "Hello World"
acción.print ()
nunca se evalúa, ni se realiza su acción (que se imprimiría()
en stdout). Entonces, "invocarprint ()
después de ..." es un poco engañoso (IMO).Respuestas:
es equivalente, gracias a las leyes de mónada, a
Ahora,
print
siempre se devuelve()
como resultado, por lo que todo el código es equivalente aFinalmente, el resultado de
main
simplemente se descarta. Es decir, la última línea podría serreturn (putStrLn "this is ignored")
y tener el mismo efecto.Por lo tanto, el código solo ejecutará el primero
print "Hello, World!"
.Yo recomendaría que siempre definas
main :: IO ()
. Haskell nos permite declararmain :: IO AnyTypeHere
, pero esto es (IMO) confuso.También recomendaría que use
putStrLn
, y noprint
para imprimir cadenas, ya que este último citará y escapará de toda la cadena.fuente
f <$> a ≡ a >>= \r -> return $ f r
no es solo una cosa específica de esta situación, sino que en realidad vale para cualquier mónada.