gpt4 book ai didi

haskell - 实例替代 IO 的目的是什么?

转载 作者:行者123 更新时间:2023-12-02 02:49:28 24 4
gpt4 key购买 nike

此实例似乎行为不正常:

> guard True <|> guard False

> guard False <|> guard False
*** Exception: user error (mzero)

有人可能会争辩说,这不会导致其他任何事情。但是为什么首先要定义这样的实例呢?是否有充分的理由导致 _|_每当评估没有意义?

最佳答案

asum 来自 Data.Foldable重复一次 IOException 很有用- 多次 throw Action ,直到成功或完全失败:

import Data.Foldable (asum)
import Control.Monad
import Control.Exception
import System.Random -- from the "random" package

diceRoll :: IO Int
diceRoll = do
putStrLn "hi"
r <- randomRIO (0,20)
if r < 18
then throwIO (userError (show r))
else return r

main :: IO ()
main = do
r <- asum $ take 7 $ repeat diceRoll
print r

鉴于“返回不抛出的第一个 Action 的结果”语义, empty必须是引发异常的操作。否则它不会作为中性元素工作,例如在 empty <|> return 4 中.

这与 Alternative的方式没有什么不同 Maybe 的实例行为。那里, asum返回第一个非 Nothing Maybe 序列中的值s。

(另一个“奇怪的” empty Alternative Concurrently 实例,它只是永远等待。 <|> 使两个 Action 相互竞争。)

关于haskell - 实例替代 IO 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48450826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com