我学习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
第二个和第三个变体运算符也是吗?
答案 0 :(得分:4)
答案 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中编程的重要之处在于了解语法规则,例如您可以将标识符包含在反引号中或用括号括起符号。了解“运营商”的确切定义并不重要。那只是一个名字。