1

タイプの入力を受け取り(int * int) list、整数のペアを出力する関数を作成する必要があります。この関数は、別の関数 printGenList (関数 f とリスト l を取り、リストのすべての要素に f を再帰的に適用する) を活用する必要があります。このコードのコードは次のように記述しました -

fun printGenList f l =
if NULL l
then ()
else ( (f (HD l) );  printGenList (f) (TL l)  );

適切なきれいな印刷を行う無名関数 (fn … => … 構造) を提供します。

4

2 に答える 2

1

タプルを確認する必要があり ます。実際には、次のシグネチャで関数を定義する必要があります。

fn : (int * int) list -> unit

したがって、関数は次のようになります。

fun pr(lst :(int * int) list) : unit =
    case lst of
         [] => ()
        |(a,b) :: xs => let 
                            val out = Int.toString a ^ Int.toString b
                        in 
                            print(out);
                            pr xs
                        end

基本的な考え方を理解していただければ幸いです。印刷フォーマットを改善してみてください!

于 2013-11-05T00:03:12.890 に答える
1

型シグネチャは、整数のペアのリストを持つように指示します。int のペアの例は(4,1). ペアのリスト[(a,b),(c,d),...]は、あなたが試したように、整数のリストのペアではなく、 になります。

(x::xs)あなたはリストをある程度理解しているように見えるので、表記法に精通していると思います。ペアに一致させる場合は、次のようにできます((n,m)::xs)。このパターンは、n と m を対応する int にバインドし、xs をリストの残りの部分にバインドします。次に、再帰は簡単です。

fun pInts [] = ()
  | pInts ((n,m)::xs) = print ("(" ^ Int.toString n ^ ", " Int.toString m ^ ")";
                        pInts xs

ここから得られる重要なことは、複数の変数を 1 つのパターンにバインドして、それらを関数で使用できるということです。リストに複数の要素があることが確実な場合は、一度に複数の要素をバインドすることもできます。

fun pairs []         = []
  | pairs [x]        = []
  | pairs (x::y::xs) = (x,y) :: pairs xs
于 2013-11-05T12:51:48.113 に答える