Example Gallery

Quicksort

qsort [] = []
qsort (x:xs) = qsort [y | y <- xs, y < x]
             ++ [x]
             ++ qsort [y | y <- xs, y >= x]

main = print (qsort [3 1 4 1 5 9 2 6])

Fibonacci with Memoization

fib_go 0 cache = (0, cache)
fib_go 1 cache = (1, cache)
fib_go n cache =
  (a, c1) = fib_go (n - 1) cache
  (b, c2) = fib_go (n - 2) c1
  (a + b, c2)

fib n = fst (fib_go n [])

JSON Processing

get_field key obj =
  unwrap (json_get key obj)

main =
  src = "{\"name\": \"Alice\", \"age\": 30}"
  parsed = unwrap (json_parse src)
  print (get_field "name" parsed)

HTTP Server

handle fd =
  req = fd_readline fd
  fd_write fd "HTTP/1.0 200 OK\r\n\r\nHello!"
  fd_close fd

main = scope
  listener = tcp_listen 8080
  loop l = client = tcp_accept l
           spawn (handle client)
           loop l
  loop listener

Pipeline

main = [1 2 3 4 5 6 7 8 9 10]
  |> filter even
  |> map (\x -> x * x)
  |> foldl (\a b -> a + b) 0
  |> print

CLI Tool

dispatch [] = print "Usage: tool <cmd>"
dispatch ("greet":name:_) =
  print "Hello, ${name}!"
dispatch ("version":_) = print "v1.0"
dispatch _ = print "Unknown command"

main = dispatch args

Binary Search Tree

data Tree a = Leaf | Node (Tree a) a (Tree a)

insert Leaf v = Node Leaf v Leaf
insert (Node l x r) v =
  ? v < x  -> Node (insert l v) x r
  : ? v > x  -> Node l x (insert r v)
  : Node l x r

member Leaf _ = false
member (Node l x r) v =
  ? v == x -> true
  : ? v < x  -> member l v
  : member r v

State Machine

data Light = Red | Yellow | Green

next Red    = Green
next Green  = Yellow
next Yellow = Red

run_n state 0 = [show state]
run_n state n =
  show state : run_n (next state) (n - 1)

main = print (run_n Red 6)