在Haskell中,运算符和函数有什么区别?

5

我刚接触Haskell,它中缀和前缀符号混用的方式让我感到困惑。 像"+"这样的运算符和像head这样的函数有什么区别?我该如何编写一个运算符'c',使得1 c 1 = 2?

我发现这个定义a!b = True。 Haskell 如何知道我是在定义!而不是函数a?

3个回答

17
在Haskell中,要创建运算符,必须使用以下“运算符符号”:
!#$%* +。 / <=>?\ ^ |:-〜
因此,例如
($$$) a b = a+b

定义了一个运算符 $$$,可以在表达式 1 $$$ 1 中使用,得到值为2。

从概念上讲,运算符和函数之间没有区别,您可以使用反引号或括号使它们相互转换。

编辑:

为了让它变得100%清晰,让我演示如何将函数转换为运算符,反之亦然:

对于运算符“+”,以下两个表达式是等价的:

1+1
(+) 1 1

同样地,对于一个函数,以下两个表达式是等价的:

foo 1 2
1 `foo` 2

2
你也可以使用中缀语法定义运算符和函数。例如,a $$$ b = a + ba\foo`b = a + b` 都可以作为定义。 (哎呀!foo 后面不应该有空格和后面的反引号。) - Thomas Eding
trinithis:没错,你说得对。我也想到了,但忘了提及。 - user231879

6
在Haskell中,你不能定义一个名为a的函数,因为在函数参数列表中,!是无效的。为了将!不作为运算符而只是普通标识符使用,你需要将它括在括号内。如果你写成a (!) b = True,那么它将定义函数a :: t -> t1 -> Bool
这就是Haskell中操作符和普通标识符之间的全部区别 - 操作符有特殊的语法规则,允许它们被用作中缀而无需反引号。否则,它们就只是函数。

5

实际上,唯一的区别在于语法。函数名以小写字母开头,后面跟着一系列字母数字字符。操作符是一些典型操作符字符(+ - / * < >等)的独特序列。

通过将函数名括在`字符中,函数可以用作运算符(中缀)。例如:

b = x `elem` xs -- b is True if x is an element in xs.

运算符可以作为函数(前缀)使用,将运算符括在括号中即可。例如:

n = (+) 2 5 -- n = 2 + 5, or 7.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接