我是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)
Haskell知道你没有定义一个被调用的函数,a因为它!在函数参数列表中无效.为了将!not用作运算符而仅作为普通标识符,您需要将其括在括号中.如果你写了a (!) b = True,那么它将定义函数a :: t -> t1 -> Bool.
这是Haskell中运算符和普通标识符之间的完全差异 - 运算符有一些特殊的语法规则,允许它们在没有反引号的情况下使用中缀.否则,它们只是功能.
真的,唯一的区别是语法.函数名称以小写字母开头,后跟一系列字母数字字符.运算符是典型运算符字符(+ - /*<>等)的一些唯一序列.
通过将函数名称括在`字符中,函数可以用作运算符(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)