Подтвердить что ты не робот

Как вы объясните ассоциативность оператора связывания в этом выражении haskell?

Без круглых скобок:

Prelude> [1,2] >>= \n -> ['a', 'b'] >>= \ch -> return (n, ch)
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]

Скобки, принимающие левую ассоциативность:

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

Скобки, предполагающие правую ассоциативность:

Prelude> [1,2] >>= (\n -> ['a', 'b'] >>= \ch -> return (n, ch))
[(1,'a'),(1,'b'),(2,'a'),(2,'b')]

Является ли >>= левым ассоциативным? Когда круглые скобки отсутствуют, почему GHCi оценивает выражение так, как будто >>= является правильным ассоциативным?

4b9b3361

Ответ 1

Да, >>= остается ассоциативным. Однако лямбды простираются насколько это возможно. Таким образом, наличие \n -> означает, что единственный правильный способ разбора выражения -

[1,2] >>= (\n -> ['a', 'b'] >>= \ch -> return (n, ch))

Обратите внимание, что ваша форма "левая ассоциативность"

([1,2] >>= \n -> ['a', 'b']) >>= \ch -> return (n, ch)

не является даже правильной. n в последнем return выходит за рамки.