這個問題在這里已經有了答案: Haskell 和惰性 Monads 評估 2 個答案 嵌套在其他未執行的 monad 中的 IO 操作 1 個答案 22 小時前關閉。
為什么下面的代碼不會導致錯誤?相反,它會立即退出。
someAction :: IO (Either String ())
someAction = return $ Left "Error"
main :: IO ()
main = either error id <$> someAction
uj5u.com熱心網友回復:
當一個型別的動作IO ()被執行時,它的回傳值(單位)不會被計算:
- 在互動式提示中:“當??(且僅當)[...] 結果型別不是時,GHCi 將列印 I/O 操作的結果
()。” - 運行編譯程式時(我已經驗證了這一點,但找不到參考!隨意編輯)。
error與 不同ioError的是,它呈現為 type 的純函式String -> a。為了簡化您的示例:
main :: IO ()
main = pure $ error "error"
作為 IO 操作運行main會執行所有副作用(其中沒有),但不會對回傳值做任何事情,因此不會對其進行評估。
然而,這會出錯,因為print評估它的論點(偶數()):
main >>= print
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/468446.html
上一篇:為haskell安裝GHCupvsvanillaGHC
下一篇:有沒有辦法自動通勤單子?
