При обчисленні IO (IO ())і те, (IO ())і ()обчислюється, так навіщо
main :: IO (IO ())
main = print <$> (print "Hello, World!")
друк
"Hello, World!"
ні
IO "Hello, World!" -- ??
"Hello, World!"
@Redu Це правильно, але зауважте, що виклик
—
чі
print ()ніколи не оцінюється, ані його дії виконуються (що було б надруковано ()у stdout). Отже, "виклик print ()після ..." трохи вводить в оману (IMO).
fmap print (print "Hello World")застосовується перший результат,printфункція, до результатуprint "Hello World". Це просто еквівалент викликуprint ()після виконанняprint "Hello World"дії.