0

来自haskellwikiexpr1 >>= \x ->

我很好奇 (>>=) 运算符的右侧\x ->。这是什么意思?

\x ->GHCi也不\x承认。:type

4

1 回答 1

2

需要明确的是,您引用的部分是这样的:

从 do 表示法到标准一元运算符的实际翻译大致是每个匹配到模式的表达式x <- expr1, 变成

expr1 >>= \x ->

并且每个没有变量赋值的表达式都expr2变成

expr2 >>= \_ ->

所有 do 块必须以单子表达式结尾,并且允许在 do 块的开头使用 let 子句(但 do 块中的 let 子句不使用in关键字)。上面的定义mothersPaternalGrandfather将被翻译为:

mothersPaternalGrandfather s = mother s >>= \m ->
                           father m >>= \gf ->
                           father gf

如您所见,->实际并非尾随。如果您查看上面引用中mothersPaternalGrandfather定义的最后一个示例,您会看到->s 都有右手边,并在下一行继续。定义中的最后一行不以->.

正如维基上的文字解释的那样,这expr1 >>= \x ->只是“大致”发生的事情。你说得对,这expr1 >>= \x ->不是有效的语法。函数定义的更完整的括号版本如下所示:

mothersPaternalGrandfather s =
  mother s >>= (\m -> father m >>= (\gf -> father gf))
于 2014-08-24T07:19:04.353 回答