什么是“运算符”字定义?

时间:2015-01-23 09:42:06

标签: haskell

我学习Haskell。 Haskell中operator字的定义是什么?我找不到明确的定义。

我认为它是类似(我自己的理解):

  

运算符函数,其名称仅包含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

第二个和第三个变体运算符也是吗?

2 个答案:

答案 0 :(得分:4)

根据Haskell Report

  

通过将操作符号括在括号中,可将其转换为普通标识符。

所以这个(!#$%&*+./<=>?@\^|-~:)是一个普通的标识符。

答案 1 :(得分:3)

好的,因为有太多的混乱,我决定给出另一个答案。

以下是Haskell 2010报告的引用:

  

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

     

运算符是运算符符号,例如+$$,或者是包含在严重重音符(反引号)中的普通标识符,例如`op`。例如,可以编写中缀应用程序op x y,而不是编写前缀应用程序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中编程的重要之处在于了解语法规则,例如您可以将标识符包含在反引号中或用括号括起符号。了解“运营商”的确切定义并不重要。那只是一个名字。