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

时间:2010-03-19 22:33:43

标签: haskell syntax

我是Haskell的新手,这种Infix和Prefix符号的混合让我很困惑。 像'+'这样的运算符和head之类的函数有什么区别?如何编写运算符'c'来执行此操作1 c 1 = 2?

我发现这个定义了! b =真。 Haskell如何知道我正在定义!而不是一个功能?

3 个答案:

答案 0 :(得分:16)

在Haskell中,要创建运算符,必​​须使用以下“运算符”:

! #$%* +。 /< => ? \ ^ | : - 〜

所以,例如

($$$) a b = a+b

定义一个运算符$$$,该表达式可以在表达式1 $$$ 1中使用,以产生值2.

从概念上讲,操作符和函数之间没有区别,你可以使用反引号或者parens来使其中一个像另一个一样工作。

修改

就这样100%清晰,让我演示将函数转换为运算符,反之亦然:

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

1+1
(+) 1 1

类似地,对于函数,以下两个表达式是等价的:

foo 1 2
1 `foo` 2

答案 1 :(得分:6)

Haskell知道你没有定义一个名为a的函数,因为!在函数参数列表中无效。为了使用!不作为运算符而仅作为普通标识符,您需要将其括在括号中。如果您改为编写a (!) b = True,那么它将定义函数a :: t -> t1 -> Bool

这是Haskell中运算符和普通标识符之间的完全差异 - 运算符有一些特殊的语法规则,允许它们在没有反引号的情况下使用中缀。否则,它们只是功能。

答案 2 :(得分:5)

真的,唯一的区别是语法。函数名称以小写字母开头,后跟一系列字母数字字符。运算符是典型运算符字符的一些唯一序列(+ - / *<>等)。

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

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

通过将运算符括在parens中,可以将运算符用作函数(预定义)。例如:

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