[Haskell-cafe] Foldable for (,)

Olaf Klinke olf at aatal-apotheke.de
Wed May 3 21:12:57 UTC 2017


Look at the Stream functor in Data.Stream [1]. Below I will argue by examples that while both Foldable and Traversable instances can be defined, the Foldable instance is less likely to produce terminating functions. 

Streams can be given a Traversable instance easily:

instance Traversable Stream where
  sequenceA (Cons fa fas) = liftA2 Cons fa (sequenceA fas)

For some applicatives this will not terminate. For streams of Maybes, sequenceA will either yield Just an infinite stream or return Nothing. Streams of IO actions also seem fine. 
A possible Foldable instance would suffer the same termination issues due to recursion. But with a monoid, folds over a stream will terminate less often, e.g. 

instance Foldable Stream where
  foldMap f (Cons x xs) = mappend (f x) (foldMap f xs)

Then,

  all (xs :: Stream Bool)

will diverge for the constant True stream and terminate for all others. 
-- Olaf


[1] http://hackage.haskell.org/package/Stream-0.4.7.2/docs/Data-Stream.html


More information about the Haskell-Cafe mailing list