-- Function definition syntax

let square x = x*x

square 9999

-- Named square function using lambda calculus syntax

let square = \x -> x*x

square 6

-- Anonymous square function

(\x -> x*x) 5

-- Currying is first-class

let plus x y = x + y

plus 2 3

let plus2 = plus 2

plus2 3

-- Function composition combinator:

let compose f g = \x ->  f (g x)

let increment = \x -> x+1

let plusonesquared = compose square increment

plusonesquared 5

let squaredplusone = compose increment square

squaredplusone 5

let fourthpower = compose square square

fourthpower 2

let plustwo = compose increment increment

plustwo 4

compose plustwo fourthpower 5

let inctwo = compose (\x -> x+1) (\x -> x+1)

inctwo 5