-1

関数 f とリスト l を取り、l のすべての要素に f を再帰的に適用する関数 printGenList を作成する必要があります。

私はこれを試しました -

fun printGenList (f (int)list):unit =
  ( f(HD list);   printGenList (f) (TL list) );

無限リストでも同じことができますが、確定リストでは取得できません。助けてください

4

2 に答える 2

1
  • 最初の(int)行にあるはずはありません。
  • HD/TLである必要がありhdますtl
  • isのケースを処理する必要がありlistますnil
于 2013-11-08T06:31:13.523 に答える
1

あなたの質問はあいまいです。私があなたを正しく理解していれば、リストを受け取り、各要素に関数を適用して結果を出力する関数が必要ですか?

f の出力が印刷可能であれば、 map でそれを行うことができます。

fun printGenList f xs = map (fn x => print (f x)) xs

明示的な再帰でそれを行う別の方法は次のとおりです。

fun printGenList f [] = ()
  | printGenList f (x::xs) = print (f x); printGenList f xs

それを行うさらに別の方法 (case ステートメントと、このサイトの多くの人が気に入っているように見える List.hd および List.tl 関数を使用):

fun printGenList f xs = case xs of
                          [] => ()
                        | xs => print (f (hd xs)); printGenList f (tl xs)

あなたが高階関数についてどの程度理解しているかはわかりませんが、高階関数はこの言語で最も強力なツールの 1 つであるため、できるだけ早く理解することをお勧めします。hd および tl 関数は、コードの意味を明確にするのではなく、コードの意味をあいまいにするだけだと思う​​ので、最後の解決策にもあまり夢中ではありません。

私があなたの質問を誤解していて、関数が明示的にそれ自体を出力することになっていない場合は、次のようなことができます:

fun printGenList f:('a -> unit) xs = *code*

この関数を使用すると、任意の ('a -> unit) 関数を呼び出すことができます。たとえば`printGenList print xs、リスト全体を出力するだけです。

于 2013-11-08T14:48:30.813 に答える