1:([2])
按预期工作。
1:$[2]
提供<interactive>:15:2: Not in scope: data constructor `:$'
我认为$
运算符括号后面的所有内容:
Haskell: difference between . (dot) and $ (dollar sign)
发生了什么事?
答案 0 :(得分:10)
您将$
放在函数和值之间,并将该函数应用于该值。
1:
不是一个功能,但(1:)
是,所以你可以(1:) $ [2]
而不是1: $ [2]
。
(你得到的错误是因为没有空格,编译器认为:$
是一回事,而不是两个,而以:
开头的运算符是数据构造函数,就像以大写字母开头的函数是数据构造函数一样。)
答案 1 :(得分:9)
$
运算符不是语法,它只是一个像其他人一样的正常函数。当你写
1 :$ [2]
编译器看到的第一个问题是:$
显示为自己的运算符(考虑+ +
与++
,这些是非常不同的事情),但:$
不是定义在任何地方。
如果你要写
1 : $ [2]
然后编译器不明白该做什么,因为你有两个紧挨着的运算符,这是不允许的,就像不允许1 + * 2
一样。这些表达根本没有任何意义。 $
运算符实际上只是定义为
f $ x = f x
但它具有较低的优先级,如算术运算符优先级Please Excuse My Dear Aunt Sally,因此您可以更轻松地链接操作。它实际上并没有将括号插入表达式。
答案 2 :(得分:6)
$
并没有将括号放在任意代码周围,而是改变了评估函数的顺序(如括号那样)。