【发布时间】:2014-02-26 21:59:25
【问题描述】:
在HaskellWiki's Do notation considered harmful,有用的应用程序部分,我发现:
值得一提的是,do有时会承担你的负担 写无聊的东西。
例如在
getRight :: Either a b -> Maybe b getRight y = do Right x <- y return x包含 y 上的
case,如果 y 不是 Right(即 Left),因此在这种情况下返回 Nothing。
在模式不匹配时调用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的解析错误是因为一般来说,一旦切换到显式大括号和分号,那么嵌套在其中的所有语言结构也必须使用显式大括号和分号:getRight y = do { let { Right x = y }; return x } -
@kosmikus:嗯,我收到“输入 `=' 解析错误”
-
不知道。为我使用 ghc-7.4.2、ghc-7.6.3 和 ghc-7.8.1-rc1 ...
-
@kosmikus:呃,没关系。完全初学者的错误:我忘记了 ghci
let getRight x =中的第一个let...
标签: haskell pattern-matching do-notation