[commit: deepseq] master: Add ($!!) and force, as per #5323 (24506ee)
Simon Marlow
marlowsd at gmail.com
Wed Jul 20 10:20:20 CEST 2011
Repository : ssh://darcs.haskell.org//srv/darcs/packages/deepseq
On branch : master
http://hackage.haskell.org/trac/ghc/changeset/24506eea886d94e8d3cc6b86e47f18b3f9d573c2
>---------------------------------------------------------------
commit 24506eea886d94e8d3cc6b86e47f18b3f9d573c2
Author: Simon Marlow <marlowsd at gmail.com>
Date: Tue Jul 19 09:39:31 2011 +0100
Add ($!!) and force, as per #5323
>---------------------------------------------------------------
Control/DeepSeq.hs | 21 ++++++++++++++++++++-
1 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/Control/DeepSeq.hs b/Control/DeepSeq.hs
index 9d72ae2..d59aebb 100644
--- a/Control/DeepSeq.hs
+++ b/Control/DeepSeq.hs
@@ -42,7 +42,7 @@
-- the wrong threads).
--
module Control.DeepSeq (
- deepseq,
+ deepseq, ($!!), force,
NFData(..),
) where
@@ -57,6 +57,8 @@ import Data.IntSet
import Data.Tree
import Data.Array
+infixr 0 $!!
+
-- | 'deepseq': fully evaluates the first argument, before returning the
-- second.
--
@@ -79,6 +81,23 @@ import Data.Array
deepseq :: NFData a => a -> b -> b
deepseq a b = rnf a `seq` b
+-- | the deep analogue of '$!'. In the expression @f $!! x@, @x@ is
+-- fully evaluated before the function @f@ is applied to it.
+($!!) :: (NFData a) => (a -> b) -> a -> b
+f $!! x = x `deepseq` f x
+
+-- | a variant of 'deepseq' that is useful in some circumstances:
+--
+-- > force x = x `deepseq` x
+--
+-- @force x@ fully evaluates @x@, and then returns it. Note that
+-- @force x@ only performs evaluation when the value of @force x@
+-- itself is demanded, so essentially it turns shallow evaluation into
+-- deep evaluation.
+
+force :: (NFData a) => a -> a
+force x = x `deepseq` x
+
-- | A class of types that can be fully evaluated.
class NFData a where
-- | rnf should reduce its argument to normal form (that is, fully
More information about the Cvs-libraries
mailing list