2011-01-31 2 views
9

В целях обучения я пытаюсь написать собственную реализацию функции 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. 

Я в тупик ...

  1. Глядя на узоры на линии 2 и 4 они кажутся взаимоисключающими, но я, очевидно, что-то отсутствует фундаментальный здесь
  2. Зачем переключать шаблоны на строках 2 и 3, чтобы ошибка компиляции исчезла.

ответ

15

сообщение об ошибке не жалуется перекрывающихся модели (ваши шаблоны перекрываются в случае двух пустых списков, но это ни проблема, ни проблема), но несколько определений функции zipWith.

Причина этого является то, что в вашем втором случае у вас есть одно определения zipWith с последующим неродственным определением zipwith (обратите внимание на нижний регистр w), а затем новое, противоречивое определением zipWith. Другими словами, это простая опечатка. (Мне потребовалось некоторое время, чтобы увидеть хотя бы - довольно непродуманная опечатка)

+2

О, этот опечаток настолько смущающий с моей стороны, спасибо за то, что он его заметил, а также объяснил мою неправильную интерпретацию ошибки. – Jabbslad

+4

+1 как для Q, так и для A. Кто-то обязательно это Google и захочет увидеть этот ответ. –

+1

Они должны действительно добавить что-то вроде «возможно опечатки» к сообщению об ошибке. – fuz

Смежные вопросы