Oh, an example: *Main> fromList [1..8] :: SkipList Z Int Cons (Branch 1 1 None None) (Cons (Branch 3 2 (Branch 1 3 None None) (Branch 1 4 None None)) (Cons (Branch 4 5 (Branch 3 6 (Branch 1 7 None None) (Branch 1 8 None None)) None) Empty)) *Main> fromList [1..8] :: SkipList (S Z) Int Cons (Branch 3 1 (Branch 1 2 None None) (Branch 1 3 None None)) (Cons (Branch 5 4 (Branch 3 5 (Branch 1 6 None None) (Branch 1 7 None None)) (Branch 1 8 None None)) Empty) *Main> fromList [1..8] :: SkipList (S (S Z)) Int Cons (Branch 7 1 (Branch 3 2 (Branch 1 3 None None) (Branch 1 4 None None)) (Branch 3 5 (Branch 1 6 None None) (Branch 1 7 None None))) (Cons (Branch 1 8 None None) Empty) *Main> let x = fromList [1..8] :: SkipList Z Int *Main> toList x [1,2,3,4,5,6,7,8] *Main> x `index` 3 Just 4 *Main> x `index` 8 Nothing Cheers! =) -- Felipe.