パターンマッチングと再帰、およびプログラムの実行方法を理解しようとしています。ネストされたパターンマッチング - 例を介したステップ実行と非常に混乱している
単純なケースで:私は上記のsum_list_num [1,2,3,4,5];
に復帰されるようSOME y
でy1
は、基本的にはアキュムレータとして機能していることを確認でき
fun sum_list_num xs =
case xs of
[] => NONE
| x::xs' => case (sum_list_num xs') of
NONE => (print "x: "; print (Int.toString x);
print "\n"; SOME x)
| SOME y => (print "x: "; print (Int.toString x);
print " y: "; print (Int.toString y); print"\n";
SOME (x+y))
:
x: 5
x: 4 y: 5
x: 3 y: 9
x: 2 y: 12
x: 1 y: 14
val it = SOME 15 : int option
私は右にアムそれを考えているのか、私はそのマークを見逃したのでしょうか?。
もっと進んだ例として、私はパターンマッチングの周りを頭で覆いたいと思っています。this postに出くわしましたが、頭や尾を作ることはできません。
fun smatch (str, in_stringlist) =
case in_stringlist of
[] => NONE
| x::x' => case(same_string(x, str), smatch (str, x')) of
(true, _) => (print "MATCH CASE x: "; print x;
print " x': "; print(gather(x'));
print "\n"; SOME x')
| (false, NONE) => (print "NONE CASE x: ";print x;
print "\n"; NONE)
| (false, SOME z) => (print "SOME Z CASE x: "; print x;
print " z: ";print(gather(z));
print " x': ";print(gather(x'));print "\n";
SOME (x :: z))
私は迷ってしまいましたsmatch("this", ["1", "2", "this", "4", "5", "6"])
NONE CASE x: 6
NONE CASE x: 5
NONE CASE x: 4
MATCH CASE x: this x': 4 5 6
SOME Z CASE x: 2 z: 4 5 6 x': this 4 5 6
SOME Z CASE x: 1 z: 2 4 5 6 x': 2 this 4 5 6
val it = SOME ["1","2","4","5","6"] : string list option
を使用して呼び出されたときに、私は全く期待していなかった出力:私は、各「一致」で何が起こっているのかプリントアウトする機能を変更した
- なぜ大文字小文字の区別で
x'
が返されますか? - 私が探している文字列がNONEの場合に評価された後に、リストのすべてが表示されるのはなぜですか?
- 私はここに座っていて、多くの編集をしてきました。再帰呼び出しを積み重ねて評価する方法で正確に何が起こっているのか厳しい時間がありました。
助けていただければ幸いです。 SMLガイドを読んで一日中パターンマッチングを行っても、これは明確になりませんでした。
注:2番目の例はCourseraクラスの宿題です(ネストされたcase文ではなくリストを構築するlet関数を使って答えました。 SMLと私の頭を1日中包むようにしている)。
FYI集まるので、私は、文字列のリストの内容をプリントアウトすることができますちょうどヘルパー関数です:
fun gather xs =
foldl (fn (x,acc) =>
acc^" "^x) (hd xs) (tl xs)
これは、ボンネットの中で何が起こっているのか、標準ライブラリへの参照を理解するのに役立ちました。 – mat4nier