为什么这段代码没有空格就无法解析?
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
所以我正在学习 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