Ich habe ich eine Funktion mit zwei Argumente, die ich Muster übertreffen muss. Wenn ich currying auf dem ersten Muster verwenden, wird es nicht kompilieren:Warum kann ich eines der Muster curry aber nicht das andere in meinem Muster übereinstimmen?
drop' :: Int -> [a] -> [a]
drop' 0 = id -- ghci: "Equations for drop' have different numbers of arguments"
drop' n (x:xs) = drop' (n-1) xs
Der Compiler diesen Ausgang gibt:
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.
Wenn ich nur das curried Muster geben, aber dann kompiliert es:
drop' :: Int -> [a] -> [a]
drop' 0 = id -- compiles
Was gibt?
Angenommen, Sie können einfach 'drop' 0 x = x 'schreiben? – Koterpillar
Alle Gleichungen, die eine Funktion definieren, müssen die gleiche Anzahl von Argumenten haben. Also 'drop 0 = id; drop n = \ (_: xs) -> drop (n-1) xs' würde kompilieren. –
[Beachten Sie, dass alle Klauseln, die eine Funktion definieren, zusammenhängend sein müssen, ** und die Anzahl der Muster in jeder Klausel muss gleich sein. **] (http://www.haskell.org/onlinereport/haskell2010/haskellch4.html# x10-830004.4.3) –