2011-10-30 2 views
-2

条件パラメータ:0 1:1。リスト2.リスト戻り値と同じ数の要素を持っていたとき1
:1.リストが長い2.リスト戻り値を超えました
リストはwよりも短かった。リスト戻り値:〜1SML機能が

([1,2,4,5],[3,2,5]); 
1 

([1,2],[1,5]); 
0 

([5],[8,2,3]); 
~1 

答えて

1

まあlength機能はこのケースでは、あなたの友人のようになります。

結果が得られます
fun foo (xs, ys) = 
    let 
     val len_xs = length xs 
     val len_ys = length ys 
    in 
     case (len_xs < len_ys, len_xs > len_ys) of 
     (true, false) => ~1 
     | (false, true) => 1 
     | (false, false) => 0 
    end 

- foo ([1,2,4,5],[3,2,5]); 
val it = 1 : int 
- foo ([1,2],[1,5]); 
val it = 0 : int 
- foo ([5],[8,2,3]); 
val it = ~1 : int 

をしかし、これは非効率的でもありますそして醜い。だから我々はまた、ちょうどそれらの1つ(または両方)になるまでの時間で、リストの各1つの要素をやってのけることができる空の取得:

fun bar ([], []) = 0 
    | bar (_, []) = 1 
    | bar ([], _) = ~1 
    | bar (_ :: xs, _ :: ys) = bar (xs, ys) 

結果与える:最初はまあ

- bar ([1,2,4,5],[3,2,5]); 
val it = 1 : int 
- bar ([1,2],[1,5]); 
val it = 0 : int 
- bar ([5],[8,2,3]); 
val it = ~1 : int 
+0

を、あなたは基本的なsmlで読んで行くwan'tかもしれません。次に、変数名をあなたの好きなところに置くことができますが、それは意味がありません。 –

+0

私はどこでもこの使用法は見ませんでした。私は尋ねなければならなかった。ごめんなさい。 – Knaas

+0

それは両方とも審美的な目的のためですが、 でも "パフォーマンス"です。他の場所で言及したように、 ワイルドカードの場合、値は変数にバインドされないため、理論的には リソースを保存します。しかし、インタプリタ/コンパイラ は、この最適化を行うのに十分にスマートであるかもしれません。この は、審美的な部分も再生する場所です。 –