'Несколько объявлений' ошибка при сопоставлении с шаблоном с подстановочным знаком

В учебных целях я пытаюсь написать свою собственную реализацию функции zipWith . Однако я столкнулся с проблемой сопоставления с образцом в крайних случаях с _ . Сначала я опишу хороший случай, а потом плохой. Надеюсь, кто-нибудь сможет объяснить, почему они ведут себя иначе. Спасибо

Если я напишу функцию zipWith следующим образом, она будет работать (обратите внимание на порядок крайних случаев, соответствующих пустому списку в строках 2 и 3): -

zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]
zipwith' _ [] _ = []
zipWith' _ _ [] = []
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys

Компиляция в GHCI: -

ghci> :l ZipWith.hs 
[1 of 1] Compiling Main             ( ZipWith.hs, interpreted )

Хорошо, все в порядке, но если я поменяю сопоставление с образцом для крайних случаев вокруг GHCI, выдает ошибку «Несколько объявлений» для строк 2 и 4.

zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith' _ _ [] = []
zipwith' _ [] _ = []
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys

Компиляция в GHCI: -

ZipWith.hs:4:0:
    Multiple declarations of `Main.zipWith''
    Declared at: ZipWith.hs:2:0
                 ZipWith.hs:4:0
Failed, modules loaded: none.

Я в тупике ...

  1. Глядя на шаблоны в строках 2 и 4 кажутся взаимоисключающими, но мне явно не хватает здесь чего-то фундаментального
  2. Почему переключение шаблонов в строках 2 и 3 приводит к исчезновению ошибки компиляции.
10
задан Jabbslad 31 January 2011 в 21:55
поделиться