Your instances of Finite are not quite right: bottom :: a bottom = doSomethingToLoopInfinitely.
instance Finite () where allValues = [(), bottom] instance Finite Nothing where allValues = [bottom] Though at a guess an allValuesExculdingBottom function is also useful, perhaps the class should be class Finite a where allValuesExcludingBottom :: [a] allValues :: Finite a => [a] allValues = (bottom:) . allValuesExcludingBottom Bob On 14 Apr 2010, at 08:01, Ashley Yakeley wrote: > Joe Fredette wrote: >> this is bounded, enumerable, but infinite. > > The question is whether there are types like this. If so, we would need a new > class: > > class Finite a where > allValues :: [a] > > instance (Finite a,Eq b) => Eq (a -> b) where > p == q = fmap p allValues == fmap q allValues > > instance (Finite a,Eq a) => Traversable (a -> b) where > sequenceA afb = fmap lookup > (sequenceA (fmap (\a -> fmap (b -> (a,b)) (afb a)) allValues)) > where > lookup :: [(a,b)] -> a -> b > lookup (a,b):_ a' | a == a' = b > lookup _:r a' = lookup r a' > lookup [] _ = undefined > > instance Finite () where > allValues = [()] > > data Nothing > > instance Finite Nothing where > allValues = [] > > -- > Ashley Yakeley > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe