В учебных целях я пытаюсь написать собственную реализацию функции 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.
я в тупике...
- Глядя на шаблоны в строках 2 и 4, они кажутся взаимоисключающими, но я явно упускаю здесь что-то фундаментальное.
- Почему переключение шаблонов в строках 2 и 3 может привести к исчезновению ошибки компиляции.