2015-03-13 61 views

回答

9

$运算符不是语法,它只是一个像其他所有函数一样的普通函数。当你写

1 :$ [2] 

第一个问题的编译器看到的是,:$表现为自身的经营者(考虑+ +++,这些都是非常不同的东西),但:$不被任何定义。

如果你写

1 : $ [2] 

那么编译器不知道该怎么办,因为你有两个运营商紧挨着对方,这是不允许的,就像1 + * 2是不允许的。这些表达根本没有任何意义。该$运营商实际上只是定义为

f $ x = f x 

但它的优先级很低,像Please Excuse My Dear Aunt Sally算术运算符优先级,这样就可以连锁经营更容易。它实际上并没有在表达式中插入圆括号。

+0

我认为这个答案比我的更值得信任,但到目前为止只有其他人加入了我的观点。 – AndrewC 2015-03-13 16:00:23

+0

@AndrewC你的答案还是不错的,你先把它贴出来,然后你提到了操作符部分,我没有做到。这不像我介意代表,在这一点上,我没有更多的特权,[我们在haskell标签上匹配得非常好](http://data.stackexchange.com/stackoverflow/query/45578/top-100-users-in-a-given-tag)= P – bheklilr 2015-03-13 16:05:44

+0

非常感谢您的解释。今天我学到了很多新东西。 – ssh 2015-03-13 17:58:20

6

$不会在任意代码周围放置括号,但会更改函数的评估顺序(如圆括号)。

+0

好点。砰一声。 (+1) – AndrewC 2015-03-13 15:23:25

10

你把$的功能和价值之间,并将其应用于函数的值。

1:不是函数,但(1:)是,所以你可以做(1:) $ [2]但不是1: $ [2]

(你得到的错误是因为没有空间,编译器认为:$是一回事,而不是两个,并开始:运营商的数据构造,就像开始与首都功能是数据的构造函数。)

+0

感谢您的回答,并解释了错误消息。你能解释为什么':1'不是一个函数吗?如果'1:[2]'给出'[1,2]',这意味着':'是'::: a - > [a] - > [a]'。通过currying'1:'会给'[a] - > [a]'这是一个函数。即使这是不正确的,那么'()'是如何将它变成函数的? – ssh 2015-03-13 18:04:55

+1

它被称为操作员部分,它是部分应用程序的一种形式。运算符有两个参数,但如果您提供其中一个参数并将其放在括号中,则编译器将其视为剩余参数的函数,并且您可以执行通常对函数执行的任何操作。例子:'(+7)'是一个函数,它在字符串的前面添加了七个'(“Hi,”++)'',而'('':)'在字符串的前面放置了一个空格。 – AndrewC 2015-03-14 11:12:27

+1

非常感谢您的任期。我在这里找到更多信息:https://wiki.haskell.org/Section_of_an_infix_operator – ssh 2015-03-16 14:45:09