Make splitAt conform to Haskell 98/2010 (fixes #1182).
authorMichal Terepeta <michal.terepeta@gmail.com>
Mon, 20 Jun 2011 19:06:20 +0000 (21:06 +0200)
committerIan Lynagh <igloo@earth.li>
Sun, 26 Jun 2011 19:57:24 +0000 (20:57 +0100)
Data/List.hs
Prelude.hs

index 8258663..78f633f 100644 (file)
@@ -181,4 +181,4 @@ module Data.List (
    , genericReplicate  -- :: (Integral a) => a -> b -> [b]
 
   ) where
-import "base" Data.List
+import "base" Data.List hiding ( splitAt )
index 9be6ccf..72e53d2 100644 (file)
@@ -137,7 +137,7 @@ import qualified "base" Control.Exception.Base as New (catch)
 import "base" Control.Monad
 import "base" System.IO
 import "base" System.IO.Error (IOError, ioError, userError)
-import "base" Data.List
+import "base" Data.List hiding ( splitAt )
 import "base" Data.Either
 import "base" Data.Maybe
 import "base" Data.Tuple
@@ -216,3 +216,24 @@ gcd 0 0         =  error "Prelude.gcd: gcd 0 0 is undefined"
 gcd x y         = GHC.Real.gcd x y
 #endif
 
+#ifndef __HUGS__
+-- The GHC's version of 'splitAt' is too strict in 'n' compared to
+-- Haskell98/2010 version. Ticket #1182.
+
+-- | 'splitAt' @n xs@ returns a tuple where first element is @xs@ prefix of
+-- length @n@ and second element is the remainder of the list:
+--
+-- > splitAt 6 "Hello World!" == ("Hello ","World!")
+-- > splitAt 3 [1,2,3,4,5] == ([1,2,3],[4,5])
+-- > splitAt 1 [1,2,3] == ([1],[2,3])
+-- > splitAt 3 [1,2,3] == ([1,2,3],[])
+-- > splitAt 4 [1,2,3] == ([1,2,3],[])
+-- > splitAt 0 [1,2,3] == ([],[1,2,3])
+-- > splitAt (-1) [1,2,3] == ([],[1,2,3])
+--
+-- It is equivalent to @('take' n xs, 'drop' n xs)@.
+-- 'splitAt' is an instance of the more general 'Data.List.genericSplitAt',
+-- in which @n@ may be of any integral type.
+splitAt                :: Int -> [a] -> ([a],[a])
+splitAt n xs           =  (take n xs, drop n xs)
+#endif