Ber*_*rgi 5 haskell pattern-matching do-notation
在HaskellWiki的Do notation被认为有害,部分有用的应用程序,我发现:
应该提到的是,你有时会承担起写无聊事情的负担.
例如
Run Code Online (Sandbox Code Playgroud)getRight :: Either a b -> Maybe b getRight y = do Right x <- y return x一个
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其他一切都是微不足道的)?这个例子可能就是这样
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可能更有原则的失败方法.