【发布时间】:2014-08-24 06:55:54
【问题描述】:
来自haskellwiki:
expr1 >>= \x ->
我很好奇 (>>=) 运算符 \x -> 的右侧。
什么意思?
:type 在GHCi 中也不能识别\x -> 和\x。
【问题讨论】:
标签: haskell monads do-notation
来自haskellwiki:
expr1 >>= \x ->
我很好奇 (>>=) 运算符 \x -> 的右侧。
什么意思?
:type 在GHCi 中也不能识别\x -> 和\x。
【问题讨论】:
标签: haskell monads do-notation
为了清楚起见,您引用的部分是这样的:
从 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 都有右手边,这在下一行继续。定义中的最后一行不以-> 结尾。
正如 wiki 上的文字所解释的,expr1 >>= \x -> 只是“大致”发生的情况。你说得对,expr1 >>= \x -> 不是有效的语法。函数定义的更完整的括号版本如下所示:
mothersPaternalGrandfather s =
mother s >>= (\m -> father m >>= (\gf -> father gf))
【讨论】: