gpt4 book ai didi

haskell - 这如何 getRight::要么 a b -> 也许 b 工作?

转载 作者:行者123 更新时间:2023-12-04 17:35:12 25 4
gpt4 key购买 nike

HaskellWiki's Do notation considered harmful , 部分有用的应用程序,我发现:

It shall be mentioned that the do sometimes takes the burden from you to write boring things.

E.g. in

getRight :: Either a b -> Maybe b
getRight y =
do Right x <- y
return x

a case on y is included, which calls fail if y is not a Right (i.e. Left), and thus returns Nothing in this case.



调用 fail ( Nothing ) 在模式不匹配上听起来很有趣,所以我想试试这个。然而,语法看起来不对——我们不在 Either monad,那么我们如何从 y 中提取任何东西? ?

确实,我尝试过,它给了我“无法将类型‘Either a’与‘Maybe’匹配”。所以让我们使用正确的模式匹配器, let在这里:
getRight y = do { let (Right x) = y; return x }

这给了我一个语法错误“输入`}'解析错误”。并不是说我明白为什么这不起作用,但让我们用多行表示法写出来:
getRight y = do
let (Right x) = y
return x

啊,这似乎有效 - 至少解析。然而:
*Main> getRight (Right 5)
Just 5
*Main> getRight (Left 5)
Just *** Exception: […]\test.hs:16:13-25: Irrefutable pattern failed for pattern (Data.Either.Right x)
-- `Nothing` was expected

是什么赋予了?所以我现在的问题是:
  • 这里发生了什么?为什么我的分号大括号行不起作用?
  • 如何正确地做到这一点(使用 do ,其他一切都是微不足道的)?
  • 最佳答案

    这个例子可能是

    getRight :: Either a b -> Maybe b
    getRight y =
    do Right x <- return y -- note: return = Just
    return x

    其中模式匹配失败调用 fail = const Nothing .它被翻译成:
    getRight y = let ok (Right x) = do {return x}
    ok _ = fail "pattern mismatch error"
    in return y >>= ok

    FWIW 最有经验的人似乎认为 fail作为 Monad方法是一个疣。退房 MonadPlus 对于失败的可能更有原则的方法。

    关于haskell - 这如何 getRight::要么 a b -> 也许 b 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054297/

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