Proposal: Add Foldable helper to Control.DeepSeq
David Feuer
david.feuer at gmail.com
Thu Jul 14 03:16:27 UTC 2016
As I describe in https://github.com/haskell/deepseq/issues/17 it is
possible to implement an NFData instance for any Foldable type, and we
can offer a function to help do that:
data Unit = Unit
instance Monoid Unit where
mempty = Unit
Unit `mappend` Unit = Unit -- strict in both arguments, unlike ()
rnfFoldable :: (Foldable f, NFData a) => f a -> ()
rnfFoldable xs = foldMap (\x -> rnf x `seq` Unit) xs `seq` ()
This could be used like so:
instance NFData a => NFData (F a) where
rnf = rnfFoldable
This version forces from left to right. It would be possible to offer
another version that forces from right to left:
data Unit2 = Unit2
instance Monoid Unit2 where
mempty = Unit2
x `mappend` Unit2 = x `seq` Unit2
rnfFoldableRTL :: (Foldable f, NFData a) => f a -> ()
rnfFoldableRTL xs = foldMap (\x -> rnf x `seq` Unit2) xs `seq` ()
More information about the Libraries
mailing list