为什么这段代码没有空格就无法解析?

Why does this code not parse without whitespace?

所以我正在学习 Monads 并且正在玩弄以下表达式:

[1,2] >>= \x -> ['a','b'] >>= \y -> return (x,y)

以上代码产生了预期的结果 [(1,a),(1,b),(2,a),(2,b)]

但是因为我只是在试验,所以偷懒了,我输入了:

[1,2]>>=\x->['a','b']>>=\y->return (x,y)(与上面相同的代码,但没有 white-spaces)

这似乎不起作用。

我知道如果我正确地把这个表达式括起来

[1,2]>>=(\x->(['a','b']>>=(\y->return (x,y))))

它会工作(我只是把 spaces 比这些可怕的括号更好)但我不明白为什么带有 white-space 的表达式有效而另一个没有。

您需要 spaces 来分隔标识符名称:foo bar 是两个独立的名称,而 foobar(没有 space)只是一个名称。

运算符也会发生同样的事情。 Haskell 允许任意用户定义的运算符;如果你想写一个名为 ??++!?! 的函数,那就去做吧!但是您必须使用spaces 将运算符彼此分开。

正如 >>=>> = 不同,因此 >>=\>>= \ 不同。如果需要,您实际上可以定义一个名为 >>=\ 的函数。但是 space 让 Haskell 语言解析器知道这是两件事,而不是一件事。

要完全理解这一点,您需要查看 Haskell 报告的第 2 章,尤其是 section 2.4。词素 ->reservedop>>= 不是。

例如,这个表达式需要 space 还是 space?

[1,2]>>=return 
[1,2] >>=return