В целях обучения я пытаюсь написать собственную реализацию функции 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
Compiling в 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, чтобы ошибка компиляции исчезла.
О, этот опечаток настолько смущающий с моей стороны, спасибо за то, что он его заметил, а также объяснил мою неправильную интерпретацию ошибки. – Jabbslad
+1 как для Q, так и для A. Кто-то обязательно это Google и захочет увидеть этот ответ. –
Они должны действительно добавить что-то вроде «возможно опечатки» к сообщению об ошибке. – fuz