2011-01-31 7 views
9

学習目的のために、zipWith関数の独自の実装を作成しようとしています。しかし、私は_のエッジケースでパターンマッチングの問題を抱えています。最初に私は良い事例、悪い事件について説明します。うまくいけば、誰かが違ったふうに行動する理由を説明できるのではないかと思います。ワイルドカードとパターンマッチングしたときの '複数の宣言'エラー

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

GHCiのにコンパイル: - - :

次のように私は zipWith関数を記述する場合、それが動作のおかげ

は(ライン2上の空のリスト& 3に一致するエッジケースの順序に注意してください)

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

[OK]を、上記微細で、まだ私は交換場合GHCiの周囲にエッジケースのパターンマッチングは行2及び4

のエラー「の複数の宣言」スローGHCiの中でのコンパイル10
zipWith' :: (a -> b -> c) -> [a] -> [b] -> [c] 
zipWith' _ _ [] = [] 
zipwith' _ [] _ = [] 
zipWith' f (x:xs) (y:ys) = f x y : zipWith' f xs ys 

は: - 私は困惑

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

エラーメッセージは、重複するパターン(2つの空のリストの場合は重複しますが、問題も問題もありません)ではなく、zipWith関数の複数の定義には言及していません。

その理由は、2番目のケースでは、あなたがzipWithの新しい、矛盾する定義が続くzipwithの無関係な定義(小文字wに注意してください)、続いzipWithの一つの定義を持っているということです。言い換えれば、単純なタイプミスです。

+2

オタクは、私の部分にとても恥ずかしいです、それを見つけてくれてありがとう、エラーの誤った解釈についても説明しています。 – Jabbslad

+4

QとAの両方に+1してください。誰かがこれを必ずGoogleに送信し、この回答を見たいと考えています。 –

+1

エラーメッセージに「おそらくタイプミス」のようなものが追加されるはずです。 – fuz

関連する問題