Haskell中的$运算符给出了数据构造函数错误

时间:2015-03-13 15:10:11

标签: haskell

1:([2])按预期工作。

1:$[2]提供<interactive>:15:2: Not in scope: data constructor `:$'

我认为$运算符括号后面的所有内容: Haskell: difference between . (dot) and $ (dollar sign)

发生了什么事?

3 个答案:

答案 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)

$并没有将括号放在任意代码周围,而是改变了评估函数的顺序(如括号那样)。