2

私は Chris Okasaki の純粋関数型データ構造を読んでいますが、問題を抱えている例が 1 つあります。ここにありますrotate特に、関数とexec関数がどのように機能するかわかりません。

fun rotate($Nil, y::_, a) = $Cons (y, a)
    | rotate ($Cons (x, xs), y :: ys, a) = 
        $Cons(x, rotate (xs, ys, $Cons (y, a)))

fun exec (f, r, $Cons (X, s)) = (f, r, s)
    | exec (f, r, $Nil) = let val f' = rotate (f, r, $Nil) in (f', [], f') end

誰かがこれを愚かな人々の言葉で表現できますか? 私はまだ ML ベースの言語を学んでいます。:-)

4

2 に答える 2

1

これは、私が学んだ標準 ML (データ コンストラクターの前に $ 文字が付いている) のようには見えませんが、おそらく変更されています。とにかく:

まず、rotate の 2 行目に小さなタイプミスがあります。$Cons

基本的に、rotate は 3 つのリストのタプルを取り、最初のリスト ++ (2 番目のリストの逆) ++ 3 番目のリストの順に組み立てます。ただし、リスト 1 とリスト 2 の両方から要素を同時にプルすることで、直線的にこれを行います。リスト 1 の先頭は、最終結果 (ao(1) 操作) にコンスされます。しかし、リスト 2 の末尾は引数として再帰呼び出しに渡され、その先頭は 3 番目の引数にコンスされます。これは、それを逆にすることになります。

その 3 番目の引数は、基本的にアキュムレータとして機能しています。アキュムレータを引数として使用する関数型プログラミングでは、より高価な計算を回避するためのトリックになる可能性があります。

exec の目的を理解していないことを認めます。文脈は何ですか?

于 2009-11-12T22:08:42.433 に答える
1

これはすべてを説明しているわけではありませんが、fun rotate($Nil, y::_, a)では、y::_はリストに一致するパターンであり、リストの先頭 (最初の要素)yとリストの末尾 (最初の要素の後のすべての項目) に としてラベルを付けることに注意してください。 _. _ワイルドカード パターンとして機能します。

パターンと. _ _::_

于 2009-11-25T19:22:09.407 に答える