“操作员”一词的定义是什么?

安德烈·布什曼

我学习Haskell。operatorHaskell中单词的定义是什么我找不到明确的定义。

我认为是这样的(我自己的理解):

运算符具有名称函数ascSymbol包含符号,而不以:符号开头,并且具有两个参数。

从Haskell 2010开始,该组ascSymbol包含:

#$%&* +。/ <=>?@ \ ˆ | -〜:

但是我不确定我是对的...例如,我认为这是运营商

(!#$%&*+./<=>?@\^|-~:) :: Int -> Int -> Int
a !#$%&*+./<=>?@\^|-~: b = a * b

输出:

λ: 10 !#$%&*+./<=>?@\^|-~: 20
200
λ: (!#$%&*+./<=>?@\^|-~:) 40 20
800

但是这个(?)呢?

(!#$%&*+./<=>?@\^|-~:) :: Int -> Int
(!#$%&*+./<=>?@\^|-~:) a = a * a

输出:

λ: (!#$%&*+./<=>?@\^|-~:) 5
25

还是这个(?)呢?

(!#$%&*+./<=>?@\^|-~:) :: Int -> Int -> Int -> Int
(!#$%&*+./<=>?@\^|-~:) a b c = a + b + c

输出:

λ: (!#$%&*+./<=>?@\^|-~:) 3 5 6
14
λ: (3 !#$%&*+./<=>?@\^|-~: 5) 6
14

第二种和第三种变体也是操作员吗?

宇宙的

好的,因为有太多的困惑,所以我决定再给出一个答案。

以下是Haskell 2010报告中的引文:

Haskell提供了特殊的语法来支持中缀表示法。运算符是可以使用中缀语法(第3.4节)或部分使用(第3.5节)应用的函数。

运算符可以是运算符,例如+$$,或者是用重音符(反引号)引起的普通标识符,例如`op`例如,op x y可以编写infix应用程序,而不是编写前缀应用程序x `op` y如果没有给出固定性声明,`op`则默认为最高优先级和左关联性(请参见第4.4.2节)。

双重地,运算符可以通过将其括在括号中而转换为普通标识符。例如,(+) x y等效于x + y,并且foldr (⋆) 1 xs等效于foldr (\x y -> x⋆y) 1 xs

因此,这定义了两个概念,即“操作员符号”和“操作员”。“运算符”是任何符号标识符。“运算符”是可以使用中缀语法应用的任何功能。

现在,让我们一个个地查看您的示例:

第一个例子

(!#$%&*+./<=>?@\^|-~:) :: Int -> Int -> Int
a !#$%&*+./<=>?@\^|-~: b = a * b

标识符!#$%&*+./<=>?@\^|-~:是一个运算符。如果用于固定位置(例如,在此定义的左侧),则将其用作运算符。

您提供两个使用示例:

λ: 10 !#$%&*+./<=>?@\^|-~: 20
200
λ: (!#$%&*+./<=>?@\^|-~:) 40 20
800

首先,我们将其用作运算符。第二,我们不这样做。

第二个例子

(!#$%&*+./<=>?@\^|-~:) :: Int -> Int
(!#$%&*+./<=>?@\^|-~:) a = a * a

名称相同,因此仍然是运算符。该定义使用括号形式,因此这里不用作运算符。

在您的示例中都没有:

λ: (!#$%&*+./<=>?@\^|-~:) 3 5 6
14
λ: (3 !#$%&*+./<=>?@\^|-~: 5) 6
14

两者都使用前缀语法。语法上讲,可以将其用作运算符,但必然会产生类型错误。

第三例

(!#$%&*+./<=>?@\^|-~:) :: Int -> Int -> Int -> Int
(!#$%&*+./<=>?@\^|-~:) a b c = a + b + c

同样,它是相同的名称,因此它仍然是运算符。在定义中不将其用作运算符,因为它是前缀。

您的用例还使用前缀语法:

λ: (!#$%&*+./<=>?@\^|-~:) 3 5 6
14
λ: (3 !#$%&*+./<=>?@\^|-~: 5) 6
14

但是可以轻松地将其用作中立位置,例如,作为运算符:

λ: (3 !#$%&*+./<=>?@\^|-~: 5) 6
14

又一个例子

考虑以下定义:

($$$) :: a -> a
($$$) x = x

在这里,$$$也是一个运算符。该定义不将其用作运算符,而是使用前缀表示法。但是,它也可以在固定位置使用,例如

λ: negate $$$ 3
-3

结束语

非正式地,人们可能会在Haskell中以不一致的方式谈论函数和运算符,因为两者之间的差异很小。都是功能。能够以中缀表示法使用的东西只是语法糖。因此,在Haskell中进行编程的重要事项是了解语法规则,例如可以将标识符括在反引号中或将括号括在括号中。知道“操作员”的确切定义并不那么重要。那只是个名字。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是什么 ??操作员?

Webometrics一词的含义是什么

“ arisdottle”一词的起源是什么?

这是什么=!操作员?

“工厂重置”一词的含义是什么

“自我”一词的目的是什么?

wx在wxWidgets一词中是什么意思?

“命令”一词背后隐藏的概念是什么?

在MySQL中,“ Stopword”一词是什么意思?

QScopedPointer中的操作员RestrictedBool的目的是什么?

“猫——”是什么意思?Linux 操作员

后管操作员的重点是什么

在N4140的第5.19 / 2.3条中,“未定义”一词是什么意思?

什么是Javascript?操作员?

操作员如何“删除”此操作到底是什么?

在Laravel中,“透明编译类”一词的含义是什么

onchange =“ javascript:updateModel()”'javascript'一词的作用是什么?

在Spring中异步发送消息时,“主题”一词是什么意思?

捕获一词在lambda的上下文中是什么意思?

“并发不可知”一词到底是什么意思?

熊猫文档中的“广播”一词是什么意思?

UNIX中的静态变量一词是什么意思?

在Eclipse中进行Java开发时,“无头”一词的含义是什么?

引导程序一词在Python Multiprocessing.Process模块中指的是什么?

[expr.const]节中的“之前的初始化”一词是什么意思

竞技场一词与记忆有关的含义是什么?

Scala的“案例类”中的“案例”一词是什么意思?

“ arp -a”输出中的“永久”一词是什么意思?

Javascript中的“功能对象”一词实际上是什么意思?