2017-11-03 9 views
1

私はここですべてをやろうとしていましたが、何も起こりませんでした。空のリストで呼び出すと、コードは正常に動作していますが、空のリスト[]を入れるとすぐに問題が起こります。それはダミーの種類 '警告し、次のコードにいくつかのエラーでポップアップ表示されます:ダミータイプSML

fun zip(xs1, x2) = 
    case xs1 of 
     [] => [] 
     | (h1::t1) => (case x2 of 
          [] => [] 
          | (h2::t2) => (h1, h2) ::zip(t1,t2)); 

出力は短いリストの長さの入力リストのヘッドでタプルの外に作成されたリストであると考えられます。この図でわかるように、少なくとも空のリストを持つ関数を呼び出すと、コンパイラが認識するコードではなく、コード自体にエラーはありません。

私は正直なところで何が起こっているのか分かりません。誰かがこのタイプのエラーが意味するものを私に説明してもらえますか?それを持たないコードをどうすれば修正できますか?

答えて

1

初めての試行では、正しくジップします。 2回目の試みでは、2つのリストの間にカンマを忘れています。 3回目の試行では成功しますが、最初のパラメータは最上位レベルの多型であるため、 value restrictionが発生しています。

ジップのきれいバージョン:

fun zip ([], _ys) = [] 
    | zip (_xs, []) = [] 
    | zip (x::xs, y::ys) = (x,y)::zip (xs, ys) 

そして短く、同等のバージョン:

fun zip (x::xs, y::ys) = (x,y)::zip (xs, ys) 
    | zip _ = [] 

Moscow ML's ListPair moduleからジップの末尾再帰バージョン:

fun zip (xs, ys) = 
    let fun helper (x::xr, y::yr, result) = helper (xr, yr, (x,y)::result) 
      | helper (_, _, result) = List.rev result 
    in zip' (xs, ys, []) end