我刚接触Haskell,它中缀和前缀符号混用的方式让我感到困惑。 像"+"这样的运算符和像head这样的函数有什么区别?我该如何编写一个运算符'c',使得1 c 1 = 2?
我发现这个定义a!b = True。 Haskell 如何知道我是在定义!而不是函数a?
($$$) a b = a+b
定义了一个运算符 $$$,可以在表达式 1 $$$ 1 中使用,得到值为2。
从概念上讲,运算符和函数之间没有区别,您可以使用反引号或括号使它们相互转换。
编辑:
为了让它变得100%清晰,让我演示如何将函数转换为运算符,反之亦然:
对于运算符“+”,以下两个表达式是等价的:
1+1
(+) 1 1
同样地,对于一个函数,以下两个表达式是等价的:
foo 1 2
1 `foo` 2
a
的函数,因为在函数参数列表中,!
是无效的。为了将!
不作为运算符而只是普通标识符使用,你需要将它括在括号内。如果你写成a (!) b = True
,那么它将定义函数a :: t -> t1 -> Bool
。实际上,唯一的区别在于语法。函数名以小写字母开头,后面跟着一系列字母数字字符。操作符是一些典型操作符字符(+ - / * < >等)的独特序列。
通过将函数名括在`字符中,函数可以用作运算符(中缀)。例如:
b = x `elem` xs -- b is True if x is an element in xs.
运算符可以作为函数(前缀)使用,将运算符括在括号中即可。例如:
n = (+) 2 5 -- n = 2 + 5, or 7.
a $$$ b = a + b
和a\
foo`b = a + b` 都可以作为定义。 (哎呀!foo 后面不应该有空格和后面的反引号。) - Thomas Eding