# FP101x - week 3 Defining Functions

# Conditional Expressions

  • abs :: Int -> Int

  • abs n = if n >= 0 then n else -n

  • signum :: Int -> Int

signum n = if n < 0 then -1 else
                    if n == 0 then 0 else 1

# Guarded Equations

 abs n | n >= 0     = n
          | otherwise = -n

 signum n | n < 0 = -1
                    | n == 0 =0
                    | otherwise = 1

# Pattern Matching

  • not :: Bool -> Bool

  • not False = True

  • not True = False

  • (&&) :: Bool -> Bool -> Bool

  • True && True = True

  • True && False = False

  • False && True = False

  • False && False = False

  • True && True = True

  • _ && _ = False

so..

  • True && b = b
  • False && _ = False

# List Pattern

  • [1,2,3,4] means 1:(2:(3:(4:[])))

  • Functions on lists can be defined using x:xs patterns

head :: [a] -> a
head (x:_) = x
tail :: [a] -> [a]
tail (_:xs) = xs
  • x:xs patterns only matches non-empty lists:
> head []
ERROR

# Lambda Expressions

  • Functions can be constructed without naming the functions by using lambda expressions
  • \x -> x+x
add x y = x + y

means

add = \x -> (\y -> x+y)
  • Lambda expressions are also useful when defining functions that return functions as results

ex)

const :: a -> b -> a
const x _ = x

to lambda

const :: a -> ( b -> a )
const x = \_ -> x

# Sections

  • An operator written before its arguments by using parentheses ex)
> 1+ 2
3
> (+) 1 2
3
> (1+) 2
3
> (+2) 1
3
  • Useful functions can sometimes be constructed in a simple way using sections.
  • ex)
  • (1+) : successor function
  • (1/) : reciprocation function
  • (*2) : doubling function
  • (/2) : halving function