У меня есть функция с двумя аргументами, которые мне нужно сопоставить. Если я использую каррирование на первом шаблоне он не будет компилироваться:Почему я могу заархивировать один из шаблонов, но не другой в моем шаблоне?
drop' :: Int -> [a] -> [a]
drop' 0 = id -- ghci: "Equations for drop' have different numbers of arguments"
drop' n (x:xs) = drop' (n-1) xs
Компилятор дает этот вывод:
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.
Если бы я только дать выделанной картины, однако затем она составляет:
drop' :: Int -> [a] -> [a]
drop' 0 = id -- compiles
Что дает?
Предполагая, что вы знаете, что можете просто написать 'drop '0 x = x'? – Koterpillar
Все уравнения, определяющие функцию, должны иметь одинаковое количество аргументов. Поэтому 'drop 0 = id; drop n = \ (_: xs) -> drop (n-1) xs' будет компилироваться. –
[Обратите внимание, что все предложения, определяющие функцию, должны быть смежными **, а количество шаблонов в каждом предложении должно быть одинаковым. **] (http://www.haskell.org/onlinereport/haskell2010/haskellch4.html# x10-830004.4.3) –