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, print
selalu kembali ()
sebagai hasilnya, sehingga seluruh kode setara dengan
main :: IO (IO ())
main = do
_ <- print "Hello, World!"
return (print ())
Akhirnya, hasil main
dibuang 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 print
mencetak string, karena yang terakhir akan mengutip dan melarikan diri dari seluruh string.
fmap print (print "Hello World")
menerapkan parameter pertama itu,print
fungsi, ke hasilprint "Hello World"
. Itu hanya setara dengan memohonprint ()
setelahprint "Hello World"
tindakan dilakukan.