0

次のコードに問題があります。

fun unsorted cmp ((x, y)::[]) = false
  | unsorted cmp ((x, y)::xx::xs) =
    if cmp(y, xx) = GREATER then true else unsorted cmp (xx::xs)

trueリストがソートされていない場合、またはそうでない場合に、この関数が返されるようにしたいだけですfalse。これは、2 番目のコンポーネントによって比較されたペアのリストに対して機能するはずです。

プレーンリストの正しいコードは次のとおりです。

fun unsorted' cmp [] = false
  | unsorted' cmp (x::[]) = false
  | unsorted' cmp (x::xx::xs) =
    if cmp(x, xx) = GREATER then true else unsorted' cmp (xx::xs)

しかし、ペアのリストで私の間違いはどこですか?

4

1 に答える 1

1

問題は への呼び出しにありますcmp。の作業バージョンの推定型は次のunsortedとおりです。('a * 'a -> order) -> 'a list -> bool

比較関数 ( type 'a * 'a -> order) と、型が の要素を含むリストを取ります'a。次に、次のパターンを使用してリストのパターン マッチを行います。つまり、との(x::xx::xs)両方が type の値にバインドされ、 とが のリストにバインドされます。次に、タイプが:の 2 タプルで呼び出します。xxx'axs'acmp'a * 'acmp(x,xx)

他のバージョンでは、ペアのリスト (つまり、 type の値) で作業したい'a * 'a listので、別のパターンを使用しています: ((x,y)::xx::xs)。この場合、xyはどちらも type の値にバインドされていますが、 type'axxペアにバインドされてい'a * 'aます。への呼び出しではcmp、これはパラメータのタイプです: 'a * ('a * 'a). ML では、すべての関数が 1 つの引数を取り、複数の引数はタプルまたはカリー化を渡すことによって実現されることを思い出してください。この例では両方を使用しています。(cmpタプルを取り、unsortedカリー化されます)

新しいバージョンで次のパターンを使用してみてください。

fun unsorted cmp ((x,y)::[]) = ...
  | unsorted cmp ((x,y)::(xx,yy)::xs) = ...

...そして、関数を完成させようとしてどこまで到達するかを確認してください。

于 2013-03-21T17:29:21.623 に答える