Ao calcular IO (IO ()), ambos (IO ())e ()é calculado, então por que
main :: IO (IO ())
main = print <$> (print "Hello, World!")
impressão
"Hello, World!"
não
IO "Hello, World!" -- ??
"Hello, World!"
@ Redu Isso está correto, mas observe que a invocação de
—
chi
print ()nunca é avaliada, nem sua ação é executada (que seria impressa ()em stdout). Portanto, "invocar print ()após ..." é um pouco enganador (IMO).
fmap print (print "Hello World")aplica seu primeiro parâmetro, aprintfunção, ao resultado deprint "Hello World". Isso é simplesmente o equivalente a invocarprint ()após aprint "Hello World"ação ser executada.