4

小さな計画者は、165ページで次のように関数の長さを0のままにします。しかし、これはどのように機能しますか?長さラムダが引数として渡された長さラムダ自体で長さラムダを評価する mk-length lambda に渡さているようです。したがって、一番下に評価されるのは、ラムダ自体の長さだけです。しかし、長さラムダはカリー化された 2 つのパラメータを取ります:と. それでは、どのように意味をなすのでしょうか?(length (cdr l))lengthlengthl(length (cdr l))

((lambda (mk-length)
   (mk-length mk-length))
 (lambda (length)
   (lambda (l)
     (cond
       ((null? l) 0)
       (else (add1
                (length (cdr l))))))))
4

1 に答える 1

5

Little Schemerは、ますます長いリストに対して機能する関数を構築しています。長さ≤0のポイントの一部は、長さがゼロ以下のリストに対してのみ機能することです (負の長さのリストは存在しないため、これは長さがゼロのリストを意味します)。あなたが意図的に示したコードは、長さがゼロのリストに対してのみ機能します。実際、これは165 ページのテキストでも指摘されています。

A:この時点で、 mk-lengthから永遠への別のアプリケーションを作成できたらどうでしょうか?
B:それは問題を 1 つに先延ばしするだけです。
A:まあ、 mk-lengthに渡す関数を誰も気にしないので、最初にmk- lengthを渡すことができます。
B:それは正しい考えです。そして、mk-lengtheternityで呼び出し、その結果をcdrで呼び出して、タワーのピースをもう 1 つ取得します。
A: では、これはまだ長さ0です。

((lambda (mk-length)
   (mk-length mk-length))
 (lambda (length)
   (lambda (l)
     (cond
       ((null? l) 0)
       (else (add1
                (length (cdr l))))))))

B:はい、 lengthの代わりにmk-lengthを使用することもできます:

((lambda (mk-length)
   (mk-length mk-length))
 (lambda (mk-length)
   (lambda (l)
     (cond
       ((null? l) 0)
       (else (add1
                (mk-length (cdr l))))))))

A:なぜそれをしたいのですか?
B:すべての名前は同じですが、ある名前は他の名前よりも同じです。
A:確かに: 名前を一貫して使用している限り、問題はありません。
B:そしてmk-lengthはlengthよりもはるかに等しい名前です。mk-lengthのような名前を使用すると、 mk-length の最初の引数がmk-lengthあることを常に思い出させます。

166 ページで、著者は、長さ 0 または 1 (つまり、≤1) のリストで機能するバージョンを示しています。最後に、167 ページで、任意の長さのリストで機能するバージョンに到達します。それがどのよう機能するかは、別の質問で詳しく説明されています。

また、次のような興味深い質問が見つかるかもしれません。

于 2013-11-01T14:17:19.633 に答える