12 Oct

Arithmetic

Basic:

> 3 + 4
7

> 1 - 3.5
-2.5

> 4 * (-2)  -- negative literals must be surrounded by parantheses
-8

Division:

> 7 / 2
3.5

> 7 `div` 2  -- equivalent to / on ints in C
3

> 7 `mod` 2  -- equivalent to % on ints in C
1  -- reminder after division

Exponentiation:

> 2 ** 4
16

> 2 ^ 4
16

Function signatures

Optional, helps in debugging.

double :: Int -> Int  -- takes an integer and returns an integer
double x = x + x

square x = x^2  -- x^2 is equivalent to x*x

Multiple arguments:

customAdd :: Int -> Int -> Int  -- takes two integers and returns one
customAdd x y = x + y + 10

After declaring a signature func :: Type -> Type, you must also write the body of the function, or at least func = undefined.

Calling functions

Parentheses are optional (when they cause no ambiguity):

> double(10)
20

> double 10
20

Functions of arity (number of arguments) 2 can be used as an infix operator:

> div 100 2
50

> 100 `div` 2  -- function name surrounded by backticks
50

Conditionals

The following are equivalent:

-- variant 1: if
fact n = if n == 0 then 1
         else n * fact(n-1)

-- variant 2: equations
fact 0 = 1
fact n = n * fact(n-1)

-- variant 3: cases
fact n
  | n == 0      = 1
  | otherwise   = n * fact(n-1)  -- otherwise is alias for True

Implied:

isDivisible x = x `mod` 3 == 0  -- implied form of:
isDivisible x = if x `mod` 3 == 0 then True else False