I have I have a function with two arguments that I have to pattern match over. If I use currying on the first pattern it won't compile:
drop' :: Int -> [a] -> [a]
drop' 0 = id -- ghci: "Equations for drop' have different numbers of arguments"
drop' n (x:xs) = drop' (n-1) xs
The compiler gives this output:
99.hs:106:3:
Equations for drop' have different numbers of arguments
99.hs:106:3-15
99.hs:107:3-33
In an equation for `split':
split xs n
= (take' n xs, drop' n xs)
where
take' 0 _ = []
take' n (x : xs) = x : take (n - 1) xs
drop' 0 = id
drop' n (x : xs) = drop' (n - 1) xs
Failed, modules loaded: none.
If I only give the curried pattern, however, then it compiles:
drop' :: Int -> [a] -> [a]
drop' 0 = id -- compiles
What gives?
The only explanation I could find (http://www.haskell.org/pipermail/haskell-cafe/2009-March/058456.html):
The problem is mostly syntactical, in the sense that most occurrences of definitions with a different number of arguments are plain typos. The other might be implementation issues: it makes pattern match rules more complex.
I can't tell you why for sure, but this is a known limitation. All cases of the same function have to have the same number of arguments.
This is an annoying "feature" of GHC, to be sure, but to fix it, you can do this:
drop' n = \(x:xs) -> drop' (n-1) xs
You have to curry both or neither, and both to the same number of arguments. If this is a lint check, that's great: but I wish there were a compiler option to turn it on/off.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With