开发者

What is the difference between an operator and a function in Haskell?

开发者 https://www.devze.com 2022-12-24 01:42 出处:网络
I am new to Haskell and this mixture of Infix and Prefix notation is confusing me. What is the difference between an operator like \'+\' and a function like head? How do I write an operator \'c\' whic

I am new to Haskell and this mixture of Infix and Prefix notation is confusing me. What is the difference between an operator like '+' and a function like head? How do I write an operator 'c' which does this 1 c 1 = 2?

I fou开发者_开发技巧nd this definition a ! b = True. How does Haskell know that I am defining ! and not a function a?


In Haskell, to create an operator you must use the following "operator symbols":

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

So, for example

($$$) a b = a+b

Defines an operator $$$ which can be used in the expression 1 $$$ 1 to yield a value of 2.

Conceptually, there is no difference between an operator and a function, and you can use backticks or parens to make one work like the other.

EDIT:

Just so it is 100% clear, let me demonstrate turning a function into an operator and vice versa:

For the operator '+', the following two expressions are equivalent:

1+1
(+) 1 1

Similarly, for a function, the following two expressions are equivalent:

foo 1 2
1 `foo` 2


Haskell knows you aren't defining a function called a because the ! wouldn't be valid in a function argument list. In order to use the ! not as an operator but just as a normal identifier, you need to enclose it in parentheses. If you wrote instead a (!) b = True, then it would define the function a :: t -> t1 -> Bool.

This is the entire difference between operators and normal identifiers in Haskell — there are special syntax rules for operators that allow them to be used infix without backticks. Otherwise, they're just functions.


Really, the only difference is syntax. Function names begin with a lower-case letter, followed by a series of alpha-numeric characters. Operators are some unique sequence of the typical operator characters (+ - / * < > etc.).

Functions can be used as operators (in-fix) by enclosing the function name in ` characters. For example:

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

Operators can be used as functions (pre-fix) by enclosing the operator in parens. For example:

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

精彩评论

暂无评论...
验证码 换一张
取 消