1

折りたたみ関数 SML を使用してルックアップ関数を作成する

k がルックアップ テーブルのキーでない場合は NONE を返し、(k,v) がテーブルにある場合は (SOME (k,v)) を返す lookup(k, table) という標準 ML の関数を作成する必要があります。たとえば、lookup(3, [(1,4),(14,5),(7,3),(22,6]) は NONE で、lookup (1,[(1,4),(14,5) ,(7,3,(22,6)]) は (SOME (1,4)) です。

そして、私はこの検索機能を使いたい:

fun find pred [] = NONE
  | find pred (x::rest) = if pred x then SOME x else find pred rest;

これは私がこれまでに持っているものです:

fun lookup(k,table) = NONE
 | lookup(k, find(k,table)) =
    if k = SOME then SOME else NONE;

私を助けてください、私はこの ML の問題のために髪を抜いています.

4

1 に答える 1

1

ここで、パターン マッチングと関数適用を混同していると思います。関数定義では、パターン マッチングを行うことができます。つまり、関数の実際の呼び出しの引数が、パラメーターに指定されたパターン (コンストラクターと変数で構成される) に一致する場合に適用されるケースを定義します。関数定義の等号の左側で関数を呼び出すことはできません。find inの使用... | lookup(k, find(k, table))は無効です。

このコードは、キーがkに一致するテーブル内の最初のキーと値のペアを返します。

fun lookup(k,table) = 
  find (fn (key, value) => key = k) table

関数findを使用してテーブルを調べます。findは抽象化を使用して、テーブルfn (key, value) => key = k内の各キーと値のペアを分解し、キーがkに一致するかどうかを確認します。lookupはfindの結果を返します。これは(k, x)tableにある場合は 、そうでない場合は になります。SOME xNONE

于 2012-11-14T08:56:35.737 に答える