Use of (n + 1) as parameter - is it more efficient?

I created my own drop' function like this: drop' :: Int -> [a] -> [a] drop' 0 xs = xs drop' n [] = [] drop' n (x:xs) = drop' (n - 1) xs But in the Haskell book I am reading it is written like this: drop' :: Int -> [a] -> [a] drop' 0 xs = xs drop' (n + 1) [] = [] drop' (n + 1) (x:xs) = drop' n xs My version seems to work but I am concerned about my third line (drop' n [] = []). Is that a problem? Why does this author use n + 1 as a parameter as opposed to n - 1 like I do in body? Or does it make no difference?

n+k patterns is a concept that used to be common in haskell but was later
determined to be a misfeature and now you have to explicitly enable it in
ghc. It was kind of a fun thing that turned out not to be necessary.
The way that you do it is the way that it is recommended now and the code
generated should be identical.
On Fri, Dec 20, 2013 at 1:00 PM, Angus Comber
I created my own drop' function like this:
drop' :: Int -> [a] -> [a] drop' 0 xs = xs drop' n [] = [] drop' n (x:xs) = drop' (n - 1) xs
But in the Haskell book I am reading it is written like this:
drop' :: Int -> [a] -> [a] drop' 0 xs = xs drop' (n + 1) [] = [] drop' (n + 1) (x:xs) = drop' n xs
My version seems to work but I am concerned about my third line (drop' n [] = []). Is that a problem?
Why does this author use n + 1 as a parameter as opposed to n - 1 like I do in body?
Or does it make no difference?
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

On Fri, Dec 20, 2013 at 06:00:08PM +0000, Angus Comber wrote:
I created my own drop' function like this:
drop' :: Int -> [a] -> [a] drop' 0 xs = xs drop' n [] = [] drop' n (x:xs) = drop' (n - 1) xs
But in the Haskell book I am reading it is written like this:
drop' :: Int -> [a] -> [a] drop' 0 xs = xs drop' (n + 1) [] = [] drop' (n + 1) (x:xs) = drop' n xs
My version seems to work but I am concerned about my third line (drop' n [] = []). Is that a problem?
Why does this author use n + 1 as a parameter as opposed to n - 1 like I do in body?
Or does it make no difference?
Using (n + 1) in the pattern match will cause the match to fail for negative numbers. But this would also need NPlusKPatterns. Note that in your implementation, negative values will result in an empty list, which is different from the GHC.List version. drop n xs | n <= 0 = xs drop _ [] = [] drop n (_:xs) = drop (n-1) xs You can easily find this out using quickcheck. λ> quickCheck $ \n xs -> drop' n xs == drop n xs -- Vikraman
participants (3)
-
Angus Comber
-
David McBride
-
Vikraman