3

私は現在スキームを学んでおり、これらの機能に出くわしました:

(define t (lambda (x) (lambda (y) x))) 
(define f (lambda (x) (lambda (y) y))) 

どうやら、それらは true と false を関数として表現したものです。理由がわかりません!

2 つの質問があります。

1) 連続するラムダは何を意味しますか? 関数に引数を渡すために使用される単一のラムダを見ることに慣れているだけです。すなわち

(define add
  (lambda (x y)
    (+ x y)))

そして呼び出す(add 1 5)ことで、出力として提供さ6れます。

2) これらの true 関数と false 関数はどのように使用されますか?

4

3 に答える 3

7

ここで行われているのは、カリー化と呼ばれるものです。n 個の複数の引数を取る関数を、一連の関数として呼び出せるように変換します。

2 つの引数を取る関数 f、つまり f(x,y) を考えてみましょう。f(x,y) = g(x)(y) =(g(x))(y) となる単項関数 g が存在します。関数 g は、f のカリー化バージョンとして知られています。

g は 1 つの引数 (x) を期待する関数であり、g(x) の値も 1 つの引数 y の関数です。

カリー化された加算関数を考えてみましょう:

(define curried-add 
  (lambda (x) 
    (lambda (y) (+ x y))))

((curried-add 1) 5)

(curried-add 1) の呼び出しは、1 つの引数 (この場合は 5) を取り、それを 1 に加算して 6 を出力する関数を返します。

これらのカリー化された追加を連鎖させて、以下を取得できます。

((curried-add ((curried-add 1) 2)) 3)

6 の出力が生成されます。これは、(curried-add 1) が 1 つの引数、この場合は 2 を期待する関数を返すためです。したがって、1 が 2 に追加され、1 つの引数を期待する関数が生成されます。 3 作ったばかりです。

この場合、真と偽の関数です。

真は次のとおりです。(define t (lambda (x) (lambda (y) x)))

偽は次のとおりです。(define f (lambda (x) (lambda (y) y)))

true 関数は 2 つの引数を取り、最初の引数を返します。false 関数は 2 つの引数の 2 番目を返します。

于 2013-01-03T20:57:04.393 に答える
2

@Hayden が彼の回答で指摘したように、連続するラムダはカリー化の例であり、本質的には別の関数を返す単なる関数です。

数学とコンピュータ サイエンスでは、カリー化とは、n 個の複数の引数 (または引数の n タプル) を取る関数を、それぞれが 1 つの引数 (部分的な引数) を持つ一連の関数として呼び出せるように変換する手法です。応用)。Moses Schönfinkel によって考案され、後に Haskell Curry によって再発見されました。

質問の 2 番目の部分: ブール値は関数としてエンコードできます。これは、ラムダ計算でChurch ブール値を使用した真理値の表現です。リンクを参照して、それらがどのように使用されているかを理解してください。

Church ブール値は、ブール値 true および false の Church エンコーディングです。一部のプログラミング言語では、これらをブール演算の実装モデルとして使用しています。例としては、Smalltalk と Pico があります。ブール値は、引数のいずれかに評価される 2 つの値の関数として表されます。ラムダ計算での正式な定義:

true ≡ λa.λb. a
false ≡ λa.λb. b
于 2013-01-03T21:19:53.137 に答える
1

それらは関数であり、1 つの引数で呼び出されると別の関数を返します。したがって、次のように呼び出すことができます-

(define v (some expression that returns t or f))
((v 'foo) 'bar) ; ==> foo if v is t, bar if v is f

これは(if v 'foo 'bar)、通常の組み込みブール値と似ています。必要最小限のラムダ計算で true/false をエンコードするためによく使用されます。

于 2013-01-03T20:51:25.737 に答える