这个getRight怎么样:: ab - >也许b工作?

Ber*_*rgi 5 haskell pattern-matching do-notation

HaskellWiki的Do notation被认为有害,部分有用的应用程序,我发现:

应该提到的是,你有时会承担起写无聊事情的负担.

例如

getRight :: Either a b -> Maybe b
getRight y =
   do Right x <- y
      return x
Run Code Online (Sandbox Code Playgroud)

一个case关于y的包括,要求如果y是不是一种权利(即左)失败,并且因此恢复在这种情况下没有.

在模式不匹配上调用fail(Nothing)听起来很有趣,所以我想尝试一下.但是,语法看起来不对 - 我们不是Eithermonad,所以我们如何从中提取任何东西y

事实上,我试过,它给了我" 无法匹配类型'要么'与'可能''.所以让我们使用正确的模式匹配器,let在这里:

getRight y = do { let (Right x) = y; return x }
Run Code Online (Sandbox Code Playgroud)

这给了我一个语法错误" 输入错误解析}} ".不是我理解为什么这不起作用,而是让我们用多行符号写出来:

getRight y = do
    let (Right x) = y
    return x
Run Code Online (Sandbox Code Playgroud)

啊,这似乎工作 - 至少解析.然而:

*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
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?所以现在我的问题是:

  • 这里发生了什么?为什么我的分号支撑线不起作用?
  • 如何正确地做到这一点(do其他一切都是微不足道的)?

jbe*_*man 9

这个例子可能就是这样

getRight :: Either a b -> Maybe b
getRight y =
   do Right x <- return y -- note: return = Just
      return x
Run Code Online (Sandbox Code Playgroud)

模式匹配失败调用的位置fail = const Nothing.它被翻译成:

getRight y = let ok (Right x) = do {return x}
                 ok _         = fail "pattern mismatch error"
             in return y >>= ok
Run Code Online (Sandbox Code Playgroud)

FWIW最有经验的人似乎认为fail一种Monad方法是疣.检查一下MonadPlus可能更有原则的失败方法.

  • 那个页面通常有一些问题...例如,整个段落都过时了,脚注说它们已经过时了(为什么不把它删除呢?). (2认同)