1:([2])
按预期工作。
1:$[2]
给<interactive>:15:2: Not in scope: data constructor `:$'
我认为$
操作parenthesizes后一切: Haskell: difference between . (dot) and $ (dollar sign)
这是怎么回事?
1:([2])
按预期工作。
1:$[2]
给<interactive>:15:2: Not in scope: data constructor `:$'
我认为$
操作parenthesizes后一切: Haskell: difference between . (dot) and $ (dollar sign)
这是怎么回事?
的$
运算符不是语法,它只是一个像其他所有函数一样的普通函数。当你写
1 :$ [2]
第一个问题的编译器看到的是,:$
表现为自身的经营者(考虑+ +
与++
,这些都是非常不同的东西),但:$
不被任何定义。
如果你写
1 : $ [2]
那么编译器不知道该怎么办,因为你有两个运营商紧挨着对方,这是不允许的,就像1 + * 2
是不允许的。这些表达根本没有任何意义。该$
运营商实际上只是定义为
f $ x = f x
但它的优先级很低,像Please Excuse My Dear Aunt Sally算术运算符优先级,这样就可以连锁经营更容易。它实际上并没有在表达式中插入圆括号。
你把$
的功能和价值之间,并将其应用于函数的值。
1:
不是函数,但(1:)
是,所以你可以做(1:) $ [2]
但不是1: $ [2]
。
(你得到的错误是因为没有空间,编译器认为:$
是一回事,而不是两个,并开始:
运营商的数据构造,就像开始与首都功能是数据的构造函数。)
感谢您的回答,并解释了错误消息。你能解释为什么':1'不是一个函数吗?如果'1:[2]'给出'[1,2]',这意味着':'是'::: a - > [a] - > [a]'。通过currying'1:'会给'[a] - > [a]'这是一个函数。即使这是不正确的,那么'()'是如何将它变成函数的? – ssh 2015-03-13 18:04:55
它被称为操作员部分,它是部分应用程序的一种形式。运算符有两个参数,但如果您提供其中一个参数并将其放在括号中,则编译器将其视为剩余参数的函数,并且您可以执行通常对函数执行的任何操作。例子:'(+7)'是一个函数,它在字符串的前面添加了七个'(“Hi,”++)'',而'('':)'在字符串的前面放置了一个空格。 – AndrewC 2015-03-14 11:12:27
非常感谢您的任期。我在这里找到更多信息:https://wiki.haskell.org/Section_of_an_infix_operator – ssh 2015-03-16 14:45:09
我认为这个答案比我的更值得信任,但到目前为止只有其他人加入了我的观点。 – AndrewC 2015-03-13 16:00:23
@AndrewC你的答案还是不错的,你先把它贴出来,然后你提到了操作符部分,我没有做到。这不像我介意代表,在这一点上,我没有更多的特权,[我们在haskell标签上匹配得非常好](http://data.stackexchange.com/stackoverflow/query/45578/top-100-users-in-a-given-tag)= P – bheklilr 2015-03-13 16:05:44
非常感谢您的解释。今天我学到了很多新东西。 – ssh 2015-03-13 17:58:20