4

プログラミングの練習で私を助けてくれるかどうか尋ねたいです。この形式のラムダ式を作成しようとしています:

λz.x(yz)

私がこれを理解する方法は、それyが value に適用される関数であるということですz。次にx、 に関数を適用すると出てくるものに関数yを適用しzます。式全体は次のようになります。

λz.x(yz) means: Do the following with the argument z:
  1. yに関数を適用しますz
  2. x最初の手順から得られるものに関数を適用します。

上記のすべてをSchemeに実行させるために、このプログラムを作成しました。

(define (zlamb)
  (lambda (z)
    (lambda (x)
      (* (lambda (y) (* z 4)) 2))))

私がそれを実行すると、私が得るのはこれだけです:

Welcome to DrRacket, version 5.3 [3m].
Language: R5RS; memory limit: 128 MB.
( (zlamb) 3)
procedure:...lambdaefing1.rkt:3:4
>

誰かが私が間違っていることを説明してもらえますか? 私が手に入れたかったのは(3 * 4) * 2 = 24. y = z * 4だから私は内部関数と外部関数を作った(または作ったと思った)x = y(z) * 2

説明を求めてインターネット全体を検索しましたが、干し草の山で探している特定の針を見つけることができません.

4

2 に答える 2

2

アラフィンウェの言うことはすべて、私には完全に理にかなっています。しかし、あなたが課題を誤解しているのではないかと心配しています。

より具体的に言うと、ラムダ計算は基本的にスキーム項のサブセットであり、構文がわずかに異なります。特に、ラムダ計算項 λz. は、Scheme では (lambda (z) ) として記述されます。ただし、 も翻訳する必要があります。

アプリケーション (zx) は、Scheme では単純に (zx) として記述されます。また、数学者は怠け者で、括弧を省略することもあるため、a(bc) は実際には (a (bc)) の省略形です。ここで、あなたの用語を直接翻訳しないように苦労しています:)。

ただし、指定されたラムダ計算項を直接 Scheme に変換すると、整形式のプログラムにはならないことに注意してください。これは、自由参照 (「バインドされていない変数」) y と z が含まれているためです。

于 2012-09-20T03:23:27.560 に答える
1

プログラムを内側から分解してみましょう。

(* z 4)

4倍zする

(lambda (y) (* z 4))

戻る関数z*4

(* (lambda (y) (* z 4)) 2)

その関数と 2 の積。関数に 2 を掛けることはできません。これがバグの原因である可能性があります。おそらく、次のことを意味します。

(define (zlamb)
  (lambda (z)
    ((lambda (y) (* 2 (y z))) ; Note the two parenthesis before lambda - this is a function application
      (lambda (z2) (* z2 4)))))

最初に、 は 3 行目の の値にバインドされているため、両方zの が同じになることに注意してください。実際には両方に名前を付けることができますが、混乱を避けるために別の名前を付けました。z2zz

さらに、基本的な問題は、関数の名前とその引数を混同しているようです。

(lambda (name) ...)

の引数を持つ無名関数を作成します。4 行目の無名関数を3行目のように参照できる理由は、namey

((lambda (y) ...) (lambda ...))

これは、2 番目の関数を引数として最初の関数に渡し、名前を付けますy

于 2012-09-20T00:12:00.250 に答える