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

unj*_*nj2 5 syntax haskell

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

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

小智 17

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

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

所以,例如

($$$) a b = a+b
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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

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

1+1
(+) 1 1
Run Code Online (Sandbox Code Playgroud)

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

foo 1 2
1 `foo` 2
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用中缀语法定义运算符和函数.例如,a a b = a + b`和`a \`foo \`b = a + b`都可以作为定义.(确实!foo之后应该没有空格和以下的反引号.) (2认同)

Chu*_*uck 6

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

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


Dan*_*att 5

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

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

b = x `elem` xs -- b is True if x is an element in xs.
Run Code Online (Sandbox Code Playgroud)

通过将操作符封装在parens中,可以将操作符用作函数(预定义).例如:

n = (+) 2 5 -- n = 2 + 5, or 7.
Run Code Online (Sandbox Code Playgroud)