packages feed

Hoed-0.2.0: examples/Insort.lhs

Haskell version of the buggy insertion sort as shown in Lee Naish
A Declarative Debugging Scheme.

> {-# LANGUAGE TemplateHaskell, Rank2Types #-}
> import Debug.Hoed
> $(observedTypes "isort"  [[t|forall a . Observable a => [] a|]])
> $(observedTypes "insert" [[t|forall a . Observable a => [] a|]])
> $(observedTypes "result" [[t|forall a . Observable a => [] a|]])

Insertion sort.

> isort :: [Int] -> [Int]
> isort ns = $(observeTempl "isort") (\ns -> {-# SCC "isort" #-} isort' ns) ns
> isort' []     = []
> isort' (n:ns) = insert n (isort ns)

Insert number into sorted list.

> insert :: Int -> [Int] -> [Int]
> insert n ms = ($(observeTempl "insert") (\n ms -> {-# SCC "insert" #-} insert' n ms)) n ms
> insert' :: Int -> [Int] -> [Int]
> insert' n []      = [n]
> insert' n (m:ms)
>       | n <= m    = n : ms -- bug: `m' is missing in this case
>       | otherwise = m : (insert n ms)

> main = printO $
>          $(observeTempl "result") ({-# SCC "result" #-} isort [1,2])