関数が取る int ref のリストがあります。リストの先頭で int をインクリメントし、最後に再帰するにはどうすればよいですか? ML は関数ごとに複数の行を実行できますか (1 つのステートメント (if..else.. など) しか実行できず、エラーが発生することなくその下に他の句/コードを記述できるようです)。
1 に答える
より多くの情報を提供していただけると本当に助かりますが、少なくとも一般的な考え方がどのように機能するかを説明できます。
ML は;
文字を使用して、2 つの式から 1 つの式を作成します。e1
2 つの式andが与えられた場合e2
、式を作成できます(e1 ; e2)
(括弧はオプションではありません。括弧がないと機能しません) 。e1
e2
e2
e2
これは少し抽象的であるため、いくつかの例を次に示します。
val a_ref = ref 0;
fun f x = (x := !x + 1; !x);
f a_ref;
これにより、値がa_ref
1 に設定され、その値が返されます。
同じ参照を保持しますが、新しい関数を定義します:
fun g x = (x := !x + 1; x := (if !x == 2 then 0 else 1); 42);
g a_ref;
これは、最初に値をa_ref
(2 に) インクリメントし、次に 2 に等しいことを確認し、ゼロに設定してから 42 を返します。
うまくいけば、これらの種類がどのように機能するかを理解するのに役立ちます;
.
さて、あなたが実際に望んでいるように見えるものに進みます:
list が与えられたl
場合、リストのすべての要素に対して何かをしたい場合は、 を使用してみてくださいapp
。例えば:
app (fn x => x := !x + 1) l;
リスト内の各参照をインクリメントします。
または、再帰を使用する場合は、
fun f [] = []
| f (x::xs) = (x := !x + 1; x::(f xs))
これにより、各参照がインクリメントされ、リストが返されます。代わりにリストを返したくない場合は、
fun f [] = ()
| f (x::xs) = (x := !x + 1; f xs);
unit
代わりに与える別のオプションです。
すべての要素をインクリメントするだけでなく、より複雑なことをしたい場合は、 f への引数を適切に変更できます。