Подтвердить что ты не робот

Почему я могу заархивировать один из шаблонов, но не другой в моем шаблоне?

У меня есть функция с двумя аргументами, с которыми мне нужно сопоставить соответствие шаблону. Если я использую 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

Что дает?

4b9b3361

Ответ 1

Единственное объяснение, которое я мог найти (http://www.haskell.org/pipermail/haskell-cafe/2009-March/058456.html):

Проблема в основном синтаксическая, в том смысле, что большинство случаев определения с различным числом аргументов - это простые опечатки. другие могут быть проблемы с реализацией: он делает правила сопоставления шаблонов более сложным.

Ответ 2

Я не могу сказать вам, почему точно, но это известное ограничение. Все случаи одной и той же функции должны иметь одинаковое количество аргументов.

Ответ 3

Это раздражающая "функция" GHC, но, чтобы исправить ее, вы можете сделать это:

drop' n = \(x:xs) -> drop' (n-1) xs

Вы должны заархивировать оба или ни того, ни другое, и оба должны иметь одинаковое количество аргументов. Если это проверка на линт, это здорово: но я бы хотел, чтобы была возможность компилятора включить/выключить.