没有任何括号:
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
超出范围.