3

注: これは一種の宿題であり、そうではありません。最終的な目標は、数値のリストとして関数に提供される一連の数値の累乗を生成する関数を作成することです。関数の再帰バージョンがありますが、ソリューション内の明示的な再帰関数 ( など) を同等のラムダのみの式に置き換えるいくつかの方法を見つける必要がありappendますmapm

そのため、小さな問題から始めて、それらをすべて組み合わせて完全な関数を作成したいと考えています。純粋なラムダ (Y コンビネーター) を使用して非再帰的な階乗関数を思い付くことができましたが、現在、リスト内のすべての数値を 2 乗する素敵な関数を考え出そうとしています。ジャンプする前に小さな問題を解決しようとしています。乗算再帰関数まで:

(define (sqrlist numlist)
  (((lambda (f)
   ((lambda (x) (x x))
    (lambda (g)
     (f (lambda (x) ((g g) x))))))
  (lambda (f)
   (lambda (x)
    (cons (sqr (first x)) (rest x))))) numlist))

上記のコードは、その前に Y コンビネータが存在するにもかかわらず、再帰しません。適切なパラメータを内部の関数に渡す際に問題が発生していることは明らかです。アイデアはありますか?

4

2 に答える 2

5

作業手順がある場合、匿名手順への変換は比較的簡単で機械的です。各ラムダに「それ自体」である追加の引数を与え、手順を複製します。そう

(define (add-list list) 
  (if (empty? list) 
      0 
      (+ (first list) (add-list (rest list)))))

なる

(λ(list) (if (empty? list) 0 (+ (first list) (add-list (rest list)))))

add-listが定義されていないため、これはもちろん問題です。そのため、毎回自分自身を渡すようにする必要があります。

(λ(self list) (if (empty? list) 0 (+ (first list) (self self (rest list)))))

しかし、そもそもどこで自分自身を手に入れるのでしょうか? さて、コピーして貼り付けます(そして引数を与えます)

((λ(self list) (if (empty? list) 0 (+ (first list) (self self (rest list)))))
 (λ(self list) (if (empty? list) 0 (+ (first list) (self self (rest list)))))
 '(1 2 3 4))

この「コピー アンド ペースト」をYコンビネータに抽象化することは、 「The Why of Y」(PDF)で見事に展開されているので、ぜひチェックしてみてください。

ただし、最初のステップは「機能させる」ことだったことを思い出してください。away を抽象化する前にこれを行いますdefine

于 2011-12-01T16:12:34.453 に答える
1

考えられる答えは次のとおりです。すでに解決済みであることは知っていますが、セカンドオピニオンがあると役立つ場合があります:)

((lambda (X)
    ((lambda (proc)
       (proc proc))
     (lambda (proc)
       (X (lambda (arg)
            ((proc proc) arg))))))
  (lambda (sqrlist)
    (lambda (lst)
      (if (null? lst)
          '()
          (cons (* (car lst) (car lst))
                (sqrlist (cdr lst)))))))

匿名関数の観点から排他的に記述されているため、「ラムダのみ」であり、使用さえしませんdefine。これを呼び出す方法は次のとおりです。

(((lambda (X)
     ((lambda (proc)
        (proc proc))
      (lambda (proc)
        (X (lambda (arg)
             ((proc proc) arg))))))
   (lambda (sqrlist)
     (lambda (lst)
       (if (null? lst)
           '()
           (cons (* (car lst) (car lst))
                 (sqrlist (cdr lst)))))))
 '(1 2 3 4 5))
于 2011-11-24T18:43:28.677 に答える