Почему я могу заархивировать один из шаблонов, но не другой в моем шаблоне?
У меня есть функция с двумя аргументами, с которыми мне нужно сопоставить соответствие шаблону. Если я использую currying по первому шаблону, он не будет компилироваться:
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
Что дает?
Ответы
Ответ 1
Единственное объяснение, которое я мог найти (http://www.haskell.org/pipermail/haskell-cafe/2009-March/058456.html):
Проблема в основном синтаксическая, в том смысле, что большинство случаев определения с различным числом аргументов - это простые опечатки. другие могут быть проблемы с реализацией: он делает правила сопоставления шаблонов более сложным.
Ответ 2
Я не могу сказать вам, почему точно, но это известное ограничение. Все случаи одной и той же функции должны иметь одинаковое количество аргументов.
Ответ 3
Это раздражающая "функция" GHC, но, чтобы исправить ее, вы можете сделать это:
drop' n = \(x:xs) -> drop' (n-1) xs
Вы должны заархивировать оба или ни того, ни другое, и оба должны иметь одинаковое количество аргументов. Если это проверка на линт, это здорово: но я бы хотел, чтобы была возможность компилятора включить/выключить.