main :: IO (IO ())
main = print <$> (print "Hello, World!")
setara, berkat hukum monad, untuk
main :: IO (IO ())
main = do
result <- print "Hello, World!"
return (print result)
Sekarang, printselalu kembali ()sebagai hasilnya, sehingga seluruh kode setara dengan
main :: IO (IO ())
main = do
_ <- print "Hello, World!"
return (print ())
Akhirnya, hasil maindibuang begitu saja. Artinya, baris terakhir bisa return (putStrLn "this is ignored")dan memiliki efek yang sama.
Karenanya kode hanya akan menjalankan yang pertama print "Hello, World!".
Saya akan merekomendasikan bahwa Anda selalu mendefinisikan main :: IO (). Haskell memungkinkan kita untuk menyatakan main :: IO AnyTypeHere, tetapi ini (IMO) membingungkan.
Saya juga merekomendasikan Anda menggunakan putStrLn, dan tidak printmencetak string, karena yang terakhir akan mengutip dan melarikan diri dari seluruh string.
fmap print (print "Hello World")menerapkan parameter pertama itu,printfungsi, ke hasilprint "Hello World". Itu hanya setara dengan memohonprint ()setelahprint "Hello World"tindakan dilakukan.