我学习Haskell。operator
Haskell中单词的定义是什么?我找不到明确的定义。
我认为是这样的(我自己的理解):
运算符是具有名称的函数,
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] 删除。
我来说两句