2012-05-07 155 views
1

我不好說英語。懶惰的評價

我想。它將被評估,並打印「abc」,「efg」。

main = return (map putStrLn ["abc", "efg"]) >> return() 

但是,我測試了它,它不起作用。

+1

追加垃圾郵件的問題是*不是很好的回答「你的問題太短」!更好的方法可能是添加更多有用的信息;)例如,解釋爲什麼你認爲它應該打印一些東西。 – delnan

+0

謝謝。 delnan。 – user1286894

回答

7
map putStrLn ["abc", "efg"] 

返回[IO()]類型的值,你那麼不執行的列表;相反,您在列表中調用return以獲得類型爲IO [IO()]的值。

您可以執行IO a值的列表與sequence_功能:

main = sequence_ (map putStrLn ["abc", "efg"]) 

或使用簡短的mapM_

main = mapM_ putStrLn ["abc", "efg"] 
+0

謝謝。 larsmans。非常有用的評論。 – user1286894

5

在任何單子,return x >> y相同ymonad 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_,如其他答案所示。

+0

感謝您的非常有用的評論。感謝哈馬爾。很有幫助。祝你好運。 – user1286894