我是Haskell的新手,这种Infix和Prefix符号的混合让我很困惑。 像'+'这样的运算符和head之类的函数有什么区别?如何编写运算符'c'来执行此操作1 c 1 = 2?
我发现这个定义了! b =真。 Haskell如何知道我正在定义!而不是一个功能?
答案 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.