Proposal: NF newtype

Edward Z. Yang ezyang at
Tue Feb 10 08:46:37 UTC 2015

I propose the following (abstract) data type, functions, and instance be
added to deepseq (naming amenable to bikeshedding):

    newtype NF a = NF a -- abstract
    makeNF :: NFData a => a -> NF a
    getNF :: NF a -> a
    instance NFData (NF a) where
        rnf x = x `seq` ()

NF is an abstract data type representing data which has been evaluated
to normal form; the guarantee specifically is, if NF is in whnf, then
it is in nf.  Crucially, when we have 'NF a', we ONLY need to seq it
in order to assure that it is fully evaluated.

This guarantee is sufficient for a variety of cases where
normal data is necessary, e.g. when transmitting data over Channels.
For example, from the monad-par library 'put_' could be used in place
of 'put' with this type signature.

    put_ :: IVar (NF a) -> (NF a) -> Par () 


More information about the Libraries mailing list