你如何解释这个haskell表达式中绑定运算符的关联性?

Vam*_*bhi 17 monads haskell

没有任何括号:

Prelude> [1,2] >>= \n -> ['a', 'b'] >>= \ch -> return (n, ch)
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]
Run Code Online (Sandbox Code Playgroud)

假设左关联性的括号:

Prelude> ([1,2] >>= \n -> ['a', 'b']) >>= \ch -> return (n, ch)
<interactive>:22:49: Not in scope: `n'
Run Code Online (Sandbox Code Playgroud)

假设正确关联的括号:

Prelude> [1,2] >>= (\n -> ['a', 'b'] >>= \ch -> return (n, ch))
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]
Run Code Online (Sandbox Code Playgroud)

是不是>>=联想?如果没有括号,为什么GHCi >>=会将表达式评估为正确关联?

kos*_*kus 19

是的,>>=是左联想的.但是,lambdas 尽可能地延伸.因此,存在\n ->意味着解析表达式的唯一正确方法是

[1,2] >>= (\n -> ['a', 'b'] >>= \ch -> return (n, ch))
Run Code Online (Sandbox Code Playgroud)

请注意您的"左关联性"表单

([1,2] >>= \n -> ['a', 'b']) >>= \ch -> return (n, ch)
Run Code Online (Sandbox Code Playgroud)

甚至不是范围正确的.该n最终return超出范围.

  • lambdas尽可能延伸.无法看到它.谢谢 ! (3认同)