来自haskellwiki:
expr1 >>= \x ->
我很好奇 (>>=) 运算符的右侧\x ->
。这是什么意思?
在\x ->
GHCi中也不\x
承认。:type
需要明确的是,您引用的部分是这样的:
从 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))