unj2
unj2

Reputation: 53511

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

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 found this definition a ! b = True. How does Haskell know that I am defining ! and not a function a?

Upvotes: 5

Views: 1548

Answers (3)

Daniel Pratt
Daniel Pratt

Reputation: 12077

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.

Upvotes: 5

Chuck
Chuck

Reputation: 237070

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.

Upvotes: 6

user231879
user231879

Reputation:

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

Upvotes: 17

Related Questions