0

問題について助けを求めています。ML でリストと関数の両方を渡す関数を作成しようとしています。基本的に、プログラムが行うべきことは、リストを取得し、各要素を関数で実行することです。関数が true を返す場合、要素がリストに追加され、関数の実行が完了するとリストが返されます。これが私のコードです:

fun select(x:list, funct)=      (* Define a new function that accepts a list and the prime function as a parameter*)
    while (tl(x) not nil) do(       (*While the tail is not empty*)
            if funct(hd(x)) then    (*Then run the function with the the head*)
                    val l = l::hd(x)        (*Adds the head of x to the list *)
            (*else 1+tl(x)*));

どんな助けでも大歓迎です。

4

2 に答える 2

4

いくつかの指針:

  • ML でループを使用することはほとんどありません。反復する必要があるときはいつでも、再帰関数を記述します。
  • タイプを指定する必要はほとんどありません。tl(x)この場合、ML は、 を呼び出しているという事実から、それがリストでxなければならないと推測できます。
  • hd(x)and を使用しtl(x)てリストを分解する代わりに、通常、関数の引数でパターン マッチングを使用してこれを行います。単一の引数の代わりに、引数xを次のように記述しますx::xs。リストの先頭と末尾xに割り当てられます。xs
  • 条件ステートメントを使用して引数の構造 (この場合はリストが空かどうか) をチェックする代わりに、さまざまなパターンで複数の関数定義を記述できます。ML は、適合するものが見つかるまで、それらを 1 つずつ試します。
  • 関数の本体は、戻り値に評価される式である必要があります。ML のすべては式です。evenは本質的に、 または のいずれかif x then a else bを返す関数です。ab

これらすべてを念頭に置いて、開始するための何かを次に示します。

fun select([], funct) = []
|   select(x::xs, funct) = ...

ここでの 2 つのケースはwhile条件を置き換えます。最初のケースは、リストが の場合にのみ評価されますnil。2 番目のケースのパターンは、リストの先頭と末尾に値を自動的に割り当てます。この定義は再帰的であることを意図しています。select([],funct)=[]は基本ケースであり、select(x::xs,funct)=...への呼び出しを含める必要がありますselect(xs,funct)

于 2012-02-04T23:43:09.290 に答える
1

リストを取得し、各要素を関数で実行します。関数が true を返す場合、要素がリストに追加され、関数の実行が終了するとリストが返されます。

これはまさに組み込みのList.filter関数です。車輪を再発明する必要はありません。

于 2012-02-04T22:18:35.173 に答える