我不好說英語。懶惰的評價
我想。它將被評估,並打印「abc」,「efg」。
main = return (map putStrLn ["abc", "efg"]) >> return()
但是,我測試了它,它不起作用。
我不好說英語。懶惰的評價
我想。它將被評估,並打印「abc」,「efg」。
main = return (map putStrLn ["abc", "efg"]) >> return()
但是,我測試了它,它不起作用。
map putStrLn ["abc", "efg"]
返回[IO()]
類型的值,你那麼不執行的列表;相反,您在列表中調用return
以獲得類型爲IO [IO()]
的值。
您可以執行IO a
值的列表與sequence_
功能:
main = sequence_ (map putStrLn ["abc", "efg"])
或使用簡短的mapM_
:
main = mapM_ putStrLn ["abc", "efg"]
謝謝。 larsmans。非常有用的評論。 – user1286894
在任何單子,return x >> y
相同y
因monad laws。
return x >> y
= return x >>= \_ -> y -- definition of >>
= (\_ -> y) x -- left identity monad law
= y -- apply the lambda
因此,return (map putStrLn ["abc", "efg"]) >> return()
相同return()
這就是爲什麼沒有任何反應。懶惰的評估與它無關。
最簡單的修復方法是使用mapM_
,如其他答案所示。
感謝您的非常有用的評論。感謝哈馬爾。很有幫助。祝你好運。 – user1286894
追加垃圾郵件的問題是*不是很好的回答「你的問題太短」!更好的方法可能是添加更多有用的信息;)例如,解釋爲什麼你認爲它應該打印一些東西。 – delnan
謝謝。 delnan。 – user1286894