2016-11-14 5 views
0

を「警告非網羅的一致」、は、取得:私が学んだことから、

fun addX (X, []) = [] 
| addX (X, y::ys) = (X + y :: addX(X, ys)); 

は完全に正常に動作しますが、私はこの方法でLIST2でリスト1を乗算しようとすると、それは「私を与えています警告:一致しないでください "、ここに私のコード:

fun multList ([], []) = [] 
| multList (x::xs, y::ys) = (x * y :: multList(xs, ys)); 

私は間違った部分をしましたか?何か助けていただきありがとうございます!

答えて

4

x::xsy::ysマッチ「非空のリスト」ので、あなたの現在のコードのみのためのパターンにマッチします

  • ([],[])が...両方のリストが空
  • (x::xs,y::ys) ..です両方のリストは非-empty

したがって、「1つのリストは空で、別のリストは空ではない」というケースを考慮する必要があります。

以下は、警告を表示しないサンプルコードです。

fun 
    multiList ([],[]) = [] 
    | multiList (X,[]) = X 
    | multiList ([],X) = X 
    | multiList (x::xs, y::ys) = (x*y ::multiList(xs,ys)); 

このコードは、いずれかのリストが空の場合に空でないものを返します。

編集: @ruakhコメントで言うように、それがmultiListのための自然な行動だので、次のコードは良いですが、私は説明のために上記のコードを残すでしょう。 _はワイルドカードなので、ときどちら([],[])(x::xs,y::ys)試合、それは何も一致していること

fun 
    multiList ([],[]) = [] 
    | multiList (x::xs, y::ys) = (x*y ::multiList(xs,ys)) 
    | multiList _ = raise Fail "lists of non equal length"; 

注意。

+0

+1私は意図した動作が実際に '| multiList _ =>不等長のリストを作成します。 – ruakh

+0

ありがとうございます!私はちょうど '| multiList(X、[])= raise DifferentLength | multiList([]、X)= raise differentLength'と同様の例外が発生します – chenchen

関連する問題