【发布时间】:2015-03-13 15:10:10
【问题描述】:
1:([2]) 按预期工作。
1:$[2] 给<interactive>:15:2: Not in scope: data constructor `:$'
我认为$ 运算符将其后面的所有内容括起来:
Haskell: difference between . (dot) and $ (dollar sign)
发生了什么事?
【问题讨论】:
标签: haskell
1:([2]) 按预期工作。
1:$[2] 给<interactive>:15:2: Not in scope: data constructor `:$'
我认为$ 运算符将其后面的所有内容括起来:
Haskell: difference between . (dot) and $ (dollar sign)
发生了什么事?
【问题讨论】:
标签: haskell
您将$ 放在函数和值之间,它会将函数应用于值。
1: 不是函数,但(1:) 是,所以你可以使用(1:) $ [2],但不能使用1: $ [2]。
(你得到的错误是因为没有空格,编译器认为:$是一回事,而不是两个,并且以:开头的运算符是数据构造函数,就像以大写字母开头的函数是数据构造函数一样。)
【讨论】:
:1 不是一个函数吗?如果1:[2] 给出[1,2],这意味着: 是: :: a -> [a] -> [a]。通过柯里化1: 将给出[a] -> [a] 这是一个函数。就算这不正确,()是怎么变成函数的?
(+7) 是一个添加 7 的函数,("Hi, "++) 在字符串前面添加,(' ':) 在字符串前面添加空格。
$ 运算符不是语法,它只是一个普通函数,就像其他函数一样。当你写
1 :$ [2]
编译器看到的第一个问题是:$ 显示为它自己的运算符(考虑+ + 与++,它们是非常不同的东西),但:$ 没有在任何地方定义。
如果你要写作
1 : $ [2]
然后编译器不知道该怎么做,因为您有两个相邻的运算符,这是不允许的,就像 1 + * 2 是不允许的一样。这些表达根本没有任何意义。 $ 运算符实际上只是定义为
f $ x = f x
但它的优先级较低,如Please Excuse My Dear Aunt Sally 用于算术运算符优先级,因此您可以更轻松地进行链接操作。它实际上并不在表达式中插入括号。
【讨论】:
$ 并不是在任意代码周围放置括号,而是更改函数的求值顺序(就像括号一样)。
【讨论】: