{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE OverlappingInstances #-} class Space a b where slice :: a -> ([b], a) instance Space [a] a where slice (l:ls) = ([l], ls) slice [] = ([], []) instance (Space sp x) => Space ([sp], [sp]) x where slice (fs, b:bs) = let enumerate :: (Space sp x) => sp -> [x] enumerate sp = let (sl, sp') = slice sp in sl ++ enumerate sp' main = do
Standard input is empty
[0,1,2,3,4,5,6,7,8,9] [(0,0),(1,0),(0,1),(2,0),(1,1),(0,2),(3,0),(2,1),(1,2),(0,3)] [(0,0,0),(0,1,0),(1,0,0),(0,0,1),(0,2,0),(1,1,0),(0,1,1),(2,0,0),(1,0,1),(0,0,2)]