No Notes! Surely, surely it deserves one! Simon
| -----Original Message----- | From: ghc-commits [mailto:[email protected]] On Behalf Of | [email protected] | Sent: 25 October 2014 11:27 | To: [email protected] | Subject: [commit: ghc] wip/oneShot: Use oneShot in the definition of | foldl etc. (6f101d2) | | Repository : ssh://[email protected]/ghc | | On branch : wip/oneShot | Link : | http://ghc.haskell.org/trac/ghc/changeset/6f101d20805fb52de0423bc8beab373 | b94bd4a7d/ghc | | >--------------------------------------------------------------- | | commit 6f101d20805fb52de0423bc8beab373b94bd4a7d | Author: Joachim Breitner <[email protected]> | Date: Sat Oct 25 12:27:06 2014 +0200 | | Use oneShot in the definition of foldl etc. | | | >--------------------------------------------------------------- | | 6f101d20805fb52de0423bc8beab373b94bd4a7d | libraries/base/Data/OldList.hs | 5 +++-- | libraries/base/GHC/List.lhs | 6 +++--- | 2 files changed, 6 insertions(+), 5 deletions(-) | | diff --git a/libraries/base/Data/OldList.hs | b/libraries/base/Data/OldList.hs | index 0e6709e..75fba35 100644 | --- a/libraries/base/Data/OldList.hs | +++ b/libraries/base/Data/OldList.hs | @@ -499,7 +499,8 @@ pairWithNil x = (x, []) | | mapAccumLF :: (acc -> x -> (acc, y)) -> x -> (acc -> (acc, [y])) -> acc | -> (acc, [y]) | {-# INLINE [0] mapAccumLF #-} | -mapAccumLF f = \x r s -> let (s', y) = f s x | +mapAccumLF f = \x r -> oneShot $ \s -> | + let (s', y) = f s x | (s'', ys) = r s' | in (s'', y:ys) | | @@ -1058,7 +1059,7 @@ unfoldr f b0 = build (\c n -> | | -- | A strict version of 'foldl'. | foldl' :: forall a b . (b -> a -> b) -> b -> [a] -> b | -foldl' k z0 xs = foldr (\(v::a) (fn::b->b) (z::b) -> z `seq` fn (k z v)) | (id :: b -> b) xs z0 | +foldl' k z0 xs = foldr (\(v::a) (fn::b->b) -> oneShot (\(z::b) -> z | `seq` fn (k z v))) (id :: b -> b) xs z0 | -- Implementing foldl' via foldr is only a good idea if the compiler can | optimize | -- the resulting code (eta-expand the recursive "go"), so this needs - | fcall-arity! | -- Also see #7994 | diff --git a/libraries/base/GHC/List.lhs b/libraries/base/GHC/List.lhs | index 2d01678..c7a0cb3 100644 | --- a/libraries/base/GHC/List.lhs | +++ b/libraries/base/GHC/List.lhs | @@ -186,7 +186,7 @@ filterFB c p x r | p x = x `c` r | | foldl :: forall a b. (b -> a -> b) -> b -> [a] -> b | {-# INLINE foldl #-} | -foldl k z0 xs = foldr (\(v::a) (fn::b->b) (z::b) -> fn (k z v)) (id :: b | -> b) xs z0 | +foldl k z0 xs = foldr (\(v::a) (fn::b->b) -> oneShot (\(z::b) -> fn (k z | v))) (id :: b -> b) xs z0 | -- Implementing foldl via foldr is only a good idea if the compiler can | optimize | -- the resulting code (eta-expand the recursive "go"), so this needs - | fcall-arity! | -- Also see #7994 | @@ -221,7 +221,7 @@ scanl = scanlGo | | {-# INLINE [0] scanlFB #-} | scanlFB :: (b -> a -> b) -> (b -> c -> c) -> a -> (b -> c) -> b -> c | -scanlFB f c = \b g x -> let b' = f x b in b' `c` g b' | +scanlFB f c = \b g -> oneShot (\x -> let b' = f x b in b' `c` g b') | | {-# INLINE [0] constScanl #-} | constScanl :: a -> b -> a | @@ -258,7 +258,7 @@ scanl' = scanlGo' | | {-# INLINE [0] scanlFB' #-} | scanlFB' :: (b -> a -> b) -> (b -> c -> c) -> a -> (b -> c) -> b -> c | -scanlFB' f c = \b g x -> let b' = f x b in b' `seq` b' `c` g b' | +scanlFB' f c = \b g -> oneShot (\x -> let b' = f x b in b' `seq` b' `c` | g b') | | {-# INLINE [0] flipSeqScanl' #-} | flipSeqScanl' :: a -> b -> a | | _______________________________________________ | ghc-commits mailing list | [email protected] | http://www.haskell.org/mailman/listinfo/ghc-commits _______________________________________________ ghc-devs mailing list [email protected] http://www.haskell.org/mailman/listinfo/ghc-devs
