Proposal: Add Foldable helper to Control.DeepSeq
David Feuer
david.feuer at gmail.com
Thu Jul 14 15:52:20 UTC 2016
I guess these are equivalent to the simpler expressions
rnfLTR = foldl' (const rnf) ()
rnfRTL = foldr' (\x _ -> rnf x) ()
On Jul 13, 2016 11:16 PM, "David Feuer" <david.feuer at gmail.com> wrote:
> 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` ()
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20160714/40fb7499/attachment.html>
More information about the Libraries
mailing list