【问题标题】:Haskell: trailing right arrow in a bind operationHaskell:绑定操作中的右箭头
【发布时间】:2014-08-24 06:55:54
【问题描述】:

来自haskellwikiexpr1 >>= \x ->

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

:typeGHCi 中也不能识别\x ->\x

【问题讨论】:

    标签: haskell monads do-notation


    【解决方案1】:

    为了清楚起见,您引用的部分是这样的:

    从 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))
    

    【讨论】:

    • 带括号的例子应该'替换原来的。
    • 你的意思是在维基上?我同意,这可能会更容易理解。我会编辑它。
    • 是的。我会做 "mother s >>= (\m -> Father m) >>= (\gf -> Father gf)" 然后加上括号是不必要的。这也会提示操作顺序。
    • 但那是错误的。仔细看看我回答中的括号。
    猜你喜欢
    • 2020-11-16
    • 2018-08-09
    • 2011-03-10
    • 1970-01-01
    • 2020-01-10
    • 2021-09-02
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多