Pada dasarnya fmap print (print "Hello World")menerapkan parameter pertama itu, printfungsi, ke hasil print "Hello World". Itu hanya setara dengan memohon print ()setelah print "Hello World"tindakan dilakukan.
Redu
@Redu Itu benar, tetapi perhatikan bahwa permohonan print ()tidak pernah dievaluasi, atau tindakannya dilakukan (yang akan mencetak ()pada stdout). Jadi, "memanggil print ()setelah ..." agak menyesatkan (IMO).
chi
Jawaban:
21
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.
Saya menambahkan bahwa f <$> a ≡ a >>= \r -> return $ f rini bukan hanya hal yang spesifik untuk situasi ini, tetapi sebenarnya berlaku untuk monad apa pun.
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.print ()
tidak pernah dievaluasi, atau tindakannya dilakukan (yang akan mencetak()
pada stdout). Jadi, "memanggilprint ()
setelah ..." agak menyesatkan (IMO).Jawaban:
setara, berkat hukum monad, untuk
Sekarang,
print
selalu kembali()
sebagai hasilnya, sehingga seluruh kode setara denganAkhirnya, hasil
main
dibuang begitu saja. Artinya, baris terakhir bisareturn (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 menyatakanmain :: IO AnyTypeHere
, tetapi ini (IMO) membingungkan.Saya juga merekomendasikan Anda menggunakan
putStrLn
, dan tidakprint
mencetak string, karena yang terakhir akan mengutip dan melarikan diri dari seluruh string.sumber
f <$> a ≡ a >>= \r -> return $ f r
ini bukan hanya hal yang spesifik untuk situasi ini, tetapi sebenarnya berlaku untuk monad apa pun.