学習目的のために、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の中でのコンパイル10zipWith' :: (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.
...
- は、彼らは相互に排他的に見えるライン2と4上のパターンを見て、私は明らかに何かが欠けています基本的なここ
- 2行目と3行目のパターンを切り替えると、コンパイルエラーがなくなるのはなぜですか?
オタクは、私の部分にとても恥ずかしいです、それを見つけてくれてありがとう、エラーの誤った解釈についても説明しています。 – Jabbslad
QとAの両方に+1してください。誰かがこれを必ずGoogleに送信し、この回答を見たいと考えています。 –
エラーメッセージに「おそらくタイプミス」のようなものが追加されるはずです。 – fuz