質問

Y-combinatorのコンピュータ科学概念から"機能的"側にはなりえない。ほとんどのプログラマはかりについてcombinators場合にもこだわりがあっての話を聞きました。

  • 何であるY-combinator?
  • どのようなcombinatorsす。
  • 佐村トミ】アクリルの心臓【オリ良いですか?
  • はないのに有用な手続きですか?
役に立ちましたか?

解決

ばん長い読み マイクVanierは 説明.長い話を短くでき、さを再帰語ることは限りませんでネイティブ.

他のヒント

Y-combinatorの"機能性"(機能を運営する他の機能を可能にする再帰ができませんを参照しての機能からです。コンピュータ科学の理論で generalizes再帰,抽出、その実装を分離してから実際の仕事の機能に質問です。を給付する必要はありませんのでコンパイル時の名称は、再帰関数はます。=)

この用語を支える ラムダ機能.の 表現に基づく自然のlambdas通常とはできないを参照して自身の名前。と,この宣言に変数の参照は、その中でも、割り当のラムダになり、あらゆる場所での自己参照ループでは、脆さが発生してしまう。のラムダ仕様の変数をコピーすることができ、独自の変数再割り当ての自己参考にする。

Y-combinatorsの煩雑さを処理機能を付加するためによく使用、 静止型 言語る 手続きの言語 いることが多いので通常タイピングの制限の数の引数の機能について調査しなければならず知られるコンパイルす。これはy combinator記載する必要があ任意の引数をカウントが必要です。

以下の例では、どのように利用及び作業のY Combinator、C#.

使用Y-combinatorに、"異例"の構築を再帰的機能です。最初に必ずお書き機能としてのコードは、既存の機能によりそのもの:

// Factorial, if func does the same thing as this bit of code...
x == 0 ? 1: x * func(x - 1);

そして機能する機能を呼び出し、返します機能なのです。これを機能的でかつ機能を操作する他の機能です。

// A function that creates a factorial, but only if you pass in
// a function that does what the inner function is doing.
Func<Func<Double, Double>, Func<Double, Double>> fact =
  (recurs) =>
    (x) =>
      x == 0 ? 1 : x * recurs(x - 1);

しかし、これらの機能を取る機能を返します他の機能とはどうのようにな因子で話自体を呼び出しの引数に渡された外部機能です。どのように書くでしょうかこの要因?パスの内部機能そのものです。Y-Combinatorになれない機能を永久名で紹介し再帰.

// One-argument Y-Combinator.
public static Func<T, TResult> Y<T, TResult>(Func<Func<T, TResult>, Func<T, TResult>> F)
{
  return
    t =>  // A function that...
      F(  // Calls the factorial creator, passing in...
        Y(F)  // The result of this same Y-combinator function call...
              // (Here is where the recursion is introduced.)
        )
      (t); // And passes the argument into the work function.
}

ではなく、要因呼び出し、その要因の因子実装によって返される再帰呼び出Y-Combinator).とによっての現在の値の関数から返される発電は、発電機、t-1、返1,解の再帰.

この複雑隠すが、すべて揺れ出実行時の鍵を握るのは"繰延実行"の破断までの繰り返る。内F 引数として渡され, すると次の繰り返し処理, 必要な場合のみ.

思い浮から http://www.mail-archive.com/boston-pm@mail.pm.org/msg02716.html は説明が書いたしました。

また利用したいと思いJavaScriptこの例では、他の多くの言語ことができます。

我々の目標は、書き再帰関数の1 変数の使用のみの機能の1変数とな 課題を定義するものの名称等(なぜこれが弊社の 目標はも質問してみましょう、この 挑戦しています。) うですか?として 例えば、を実装しよう要因.

でもステップ1ではないとはいえないことであれば容易にし 騙ます。機能の利用を2変数 譲渡できる必要性を回避するために使用 課題の再帰.

// Here's the function that we want to recurse.
X = function (recurse, n) {
  if (0 == n)
    return 1;
  else
    return n * recurse(recurse, n - 1);
};

// This will get X to recurse.
Y = function (builder, n) {
  return builder(builder, n);
};

// Here it is in action.
Y(
  X,
  5
);

現在を見てみましょうできれば、不正行為を行えます。でもまずまいを 課題ではないと思います。ますX Yインライン.

// No assignment this time.
function (builder, n) {
  return builder(builder, n);
}(
  function (recurse, n) {
    if (0 == n)
      return 1;
    else
      return n * recurse(recurse, n - 1);
  },
  5
);

それだけでなく、機能を利用は2変数の取得機能の1 可変となります。が固まった。もスマートガイの名 ウカレーはウッば良い高次 機能だけで、残りは機能の1変数となります。の 証明できることで得らの機能の2以上の 総合例)変数の1変数純粋に 機械的なテキスト変換のようになります:

// Original
F = function (i, j) {
  ...
};
F(i,j);

// Transformed
F = function (i) { return function (j) {
  ...
}};
F(i)(j);

どこ---は完全に同じなのです。(このトリックするという "currying"の発明者言語のウにも 名ウカレーです。ファイルの下に文句.) 今でこの変換もしく 当社の最終バージョン。

// The dreaded Y-combinator in action!
function (builder) { return function (n) {
  return builder(builder)(n);
}}(
  function (recurse) { return function (n) {
    if (0 == n)
      return 1;
    else
      return n * recurse(recurse)(n - 1);
  }})(
  5
);

気軽にアクセスすることとする。alert()に戻すことで、提携し、ボタンなどを実行します。このコードを計算しfactorials再帰的にな 譲渡、宣言、または機能の2つの変数.( て追跡できる頭をスピン。手渡したりではなく、導出は、やや媒体 結果コードで必ずバッフルや混乱させ.)

交換できる4線を再帰的に定義し要因と その他の再帰的機能することができます。

かが生じた場合での使用を作成することを、根本から洗い直すことです。そうですね。ここでの基本で、再帰的因子の機能:

function factorial(n) {
    return n == 0 ? 1 : n * factorial(n - 1);
}

ましょうrefactor新しい機能と呼ばれるもの fact セットを返しま匿名因子コンピューティング機能を行うのではなく、計算そのもの:

function fact() {
    return function(n) {
        return n == 0 ? 1 : n * fact()(n - 1);
    };
}

var factorial = fact();

ちょっと変わったもののようです。まだ新たに生成因子の機能で行います。

再帰のこの段階ではまだかなり顕在化する。の fact 機能はその名前がついています。ましょうparameterizeの再帰呼び出し:

function fact(recurse) {
    return function(n) {
        return n == 0 ? 1 : n * recurse(n - 1);
    };
}

function recurser(x) {
    return fact(recurser)(x);
}

var factorial = fact(recurser);

ことになるが、 recurser まだニーズを知り、その名前がついています。ましょうparameterizeするでしょう:

function recurser(f) {
    return fact(function(x) {
        return f(f)(x);
    });
}

var factorial = recurser(recurser);

現在の代わりに呼び出し recurser(recurser) 直してみようかなラッパー機能を返しますその結果:

function Y() {
    return (function(f) {
        return f(f);
    })(recurser);
}

var factorial = Y();

できるようになってきたのか recurser 名斉;での引数の内部関数の置き換えの機能そのもの:

function Y() {
    return (function(f) {
        return f(f);
    })(function(f) {
        return fact(function(x) {
            return f(f)(x);
        });
    });
}

var factorial = Y();

の外部の名が参照する fact, では明確であるべきであることを簡単にパラメータ化されたもの、レンジュ

function Y(le) {
    return (function(f) {
        return f(f);
    })(function(f) {
        return le(function(x) {
            return f(f)(x);
        });
    });
}

var factorial = Y(function(recurse) {
    return function(n) {
        return n == 0 ? 1 : n * recurse(n - 1);
    };
});

多くの回答が上記のY combinator なかで のための.

固定小数点combinators 使用されることを示 ラムダ計算チューリング完了.これは非常に重要な結果の計算理論、理論的基盤 プログラミング.

勉強固定点combinatorsも助かったから機能プラグインです。いつことができ、実際のプロになってる。

y-combinatorに JavaScript:

var Y = function(f) {
  return (function(g) {
    return g(g);
  })(function(h) {
    return function() {
      return f(h(h)).apply(null, arguments);
    };
  });
};

var factorial = Y(function(recurse) {
  return function(x) {
    return x == 0 ? 1 : x * recurse(x-1);
  };
});

factorial(5)  // -> 120

編集:私の名前は載っていませんでしたくらみるコードが、その金と銀の使用法がひときわビットも飲み込むなく一部の背景-それはそれとして。一部の一般的知識の提示によるその他の回答でき取りにほどのことが起こっているのです。

Y機能は、"y-combinator".現在の var factorial ラインがあり、Yは使用します。通知する機能であるパラメータ(この例では、 recurse)でも使用されているその後の内部機能です。パラメータ名は基本的には名の内部機能で、再帰話を利用してい recurse() でも定義で設定します。) Y-combinatorを行うマジックの関連付けその匿名の内部関数のパラメータの名前の関数に渡されるY.

の説明Yは、魔法の リンク条 (せんちなみ.)

プログラマなたプログラミングに深、ならびに注意を払っていないこれから始め、緩やん:

Y combinator式き再帰を実施状態での機能を持つことができない名前ができたとして引数として使用される、戻り値内で定義されたその他の機能.

この作品の機能そのものの引数で呼びます。

この部分のラムダ計算する場合には数字が効果的プログラミング言語には基本的なコンピュータ科学を中心に機能性プログラミング

の日々の実践的な価値のY combinatorに限定し、プログラミング言語で低くなる傾向があります。

場所を特定する必要があるので警察のラインナップしてください:

Y=λf.(λx.f(x x))(λx.f(x))

できる通常のスポットでの繰り返し (λx.f (x x)).

λ シンボルは、ギリシャ文字のラムダには、ラムダ計算、その名前があるの (λx.t) スタイル用のためのラムダ計算ようになります。●

その他の回答を写簡潔に答えることなく、一つの重要な事実:必要な実施における不動点演算子実用的な言語がこの巻き込み、そして現実的な目的を除き、いかY-combinatorが").この重要な理論的な概念での実践的な値です。

こちらはJavaScriptの実施にY-Combinatorの因子の機能(ダグラスからCrockfordの記事、ご利用 http://javascript.crockford.com/little.html).

function Y(le) {
    return (function (f) {
        return f(f);
    }(function (f) {
        return le(function (x) {
            return f(f)(x);
        });
    }));
}

var factorial = Y(function (fac) {
    return function (n) {
        return n <= 2 ? n : n * fac(n - 1);
    };
});

var number120 = factorial(5);

Y-Combinatorが磁束コンデンサといいます。

さんにおすすめしたい一種の"愚か者ガイド"のY-Combinatorの両Clojureおよびスキームのために自分come to grips withます。彼の影響を受け材料"のSchemer"

スキーム:https://gist.github.com/z5h/238891

やClojure:https://gist.github.com/z5h/5102747

両方のチュートリアルのコード列のコメントはカット&pastableお気に入ります。

匿名の再帰

固定小数点トcombinatorが、より高次な機能 fix この定義を満たすこと等価性

forall f.  fix f  =  f (fix f)

fix f は解決 x の定点式

               x  =  f x

の要因の自然数できるようにするには、できるだけ

fact 0 = 1
fact n = n * fact (n - 1)

を使用 fix, にあたり、任意の建設的な証明を一時的に楽しむ方法から本格的な/μ-再帰機能を導き出す事ができなくnonymous自referentiality.

fact n = (fix fact') n

場所

fact' rec n = if n == 0
                then 1
                else n * rec (n - 1)

その

   fact 3
=  (fix fact') 3
=  fact' (fix fact') 3
=  if 3 == 0 then 1 else 3 * (fix fact') (3 - 1)
=  3 * (fix fact') 2
=  3 * fact' (fix fact') 2
=  3 * if 2 == 0 then 1 else 2 * (fix fact') (2 - 1)
=  3 * 2 * (fix fact') 1
=  3 * 2 * fact' (fix fact') 1
=  3 * 2 * if 1 == 0 then 1 else 1 * (fix fact') (1 - 1)
=  3 * 2 * 1 * (fix fact') 0
=  3 * 2 * 1 * fact' (fix fact') 0
=  3 * 2 * 1 * if 0 == 0 then 1 else 0 * (fix fact') (0 - 1)
=  3 * 2 * 1 * 1
=  6

この形式的証明

fact 3  =  6

methodically用の固定点combinatorの同等性のための 書き換え回

fix fact'  ->  fact' (fix fact')

ラムダ計算

untypedラムダ計算 理論で構成されて文脈自由文法

E ::= v        Variable
   |  λ v. E   Abstraction
   |  E E      Application

場所 v 範囲の変数は、 ベータeta削減 ルール

(λ x. B) E  ->  B[x := E]                                 Beta
  λ x. E x  ->  E          if x doesn’t occur free in E   Eta

ベータ削減の代替すべて無料の発生の可変 x の抽象化("機能")ボディ B の表現("引数") E.Eta削除冗長可能です。ることもあり、省略からの理論.An 既約 表現するno還ルールを適用するには 通常の または 正規の形式.

λ x y. E

は以下の表記

λ x. λ y. E

(抽象化multiarity),

E F G

は以下の表記

(E F) G

(左associativity),

λ x. x

λ y. y

アルファ換.

抽象化と応用のみを"言語のプリミティブ"のラムダ計算がすことができること エンコード の任意の複雑なデータます。

教会の数字はエンコードの自然数と同様にペアノ-公理的naturals(ナチュラル).

   0  =  λ f x. x                 No application
   1  =  λ f x. f x               One application
   2  =  λ f x. f (f x)           Twofold
   3  =  λ f x. f (f (f x))       Threefold
    . . .

SUCC  =  λ n f x. f (n f x)       Successor
 ADD  =  λ n m f x. n f (m f x)   Addition
MULT  =  λ n m f x. n (m f) x     Multiplication
    . . .

正式な証明

1 + 2  =  3

に書き換えルールのベータ版を削減

   ADD                      1            2
=  (λ n m f x. n f (m f x)) (λ g y. g y) (λ h z. h (h z))
=  (λ m f x. (λ g y. g y) f (m f x)) (λ h z. h (h z))
=  (λ m f x. (λ y. f y) (m f x)) (λ h z. h (h z))
=  (λ m f x. f (m f x)) (λ h z. h (h z))
=  λ f x. f ((λ h z. h (h z)) f x)
=  λ f x. f ((λ z. f (f z)) x)
=  λ f x. f (f (f x))                                       Normal form
=  3

Combinators

にラムダ計算, combinators は抽象化が図られている無料の変数.最も単純に: I, アイデンティティのcombinator

λ x. x

同的に機能

id x = x

なcombinatorsのプリミティブ事業者の combinator結石 のようなスキーシステム。

S  =  λ x y z. x z (y z)
K  =  λ x y. x
I  =  λ x. x

ベータ削減な 強正規化;ないすべて削表現"redexes",機械的に試算すると通常形態の下でのベータ。簡単な例は末広がりのオメガ ω combinator

λ x. x x

自:

   (λ x. x x) (λ y. y y)
=  (λ y. y y) (λ y. y y)
. . .
=  _|_                     Bottom

削減の左端subexpressions("ヘッド")が優先されます。 応用順 正規化の引数の前に置き換え、 通常の順序 ではできません。二つの戦略に類似意欲の評価などC、怠け者の評価などウ.

   K          (I a)        (ω ω)
=  (λ k l. k) ((λ i. i) a) ((λ x. x x) (λ y. y y))

半導体レーザの出力は大きく拡散の下でも応用のためbeta削減

=  (λ k l. k) a ((λ x. x x) (λ y. y y))
=  (λ l. a) ((λ x. x x) (λ y. y y))
=  (λ l. a) ((λ y. y y) (λ y. y y))
. . .
=  _|_

厳しい 意味論

forall f.  f _|_  =  _|_

が収束の下流を通常のためのベータの削減

=  (λ l. ((λ i. i) a)) ((λ x. x x) (λ y. y y))
=  (λ l. a) ((λ x. x x) (λ y. y y))
=  a

場合に表現は通常の形態で、通常のためのベータ削減できます。

Y

の重要な資産の Y 定点combinator

λ f. (λ x. f (x x)) (λ x. f (x x))

で与えられます

   Y g
=  (λ f. (λ x. f (x x)) (λ x. f (x x))) g
=  (λ x. g (x x)) (λ x. g (x x))           =  Y g
=  g ((λ x. g (x x)) (λ x. g (x x)))       =  g (Y g)
=  g (g ((λ x. g (x x)) (λ x. g (x x))))   =  g (g (Y g))
. . .                                      . . .

同等性

Y g  =  g (Y g)

と同型になる

fix f  =  f (fix f)

のuntypedラムダ計算できるエンコードの任意の建設的な証明を一時的に楽しむ方法から本格的な/μ-recursiveます。

 FACT  =  λ n. Y FACT' n
FACT'  =  λ rec n. if n == 0 then 1 else n * rec (n - 1)

   FACT 3
=  (λ n. Y FACT' n) 3
=  Y FACT' 3
=  FACT' (Y FACT') 3
=  if 3 == 0 then 1 else 3 * (Y FACT') (3 - 1)
=  3 * (Y FACT') (3 - 1)
=  3 * FACT' (Y FACT') 2
=  3 * if 2 == 0 then 1 else 2 * (Y FACT') (2 - 1)
=  3 * 2 * (Y FACT') 1
=  3 * 2 * FACT' (Y FACT') 1
=  3 * 2 * if 1 == 0 then 1 else 1 * (Y FACT') (1 - 1)
=  3 * 2 * 1 * (Y FACT') 0
=  3 * 2 * 1 * FACT' (Y FACT') 0
=  3 * 2 * 1 * if 0 == 0 then 1 else 0 * (Y FACT') (0 - 1)
=  3 * 2 * 1 * 1
=  6

(乗算、合流)

のためのChurchian untypedラムダ計算が示されているのが存在する徴の無限遠方での定点combinatorsほか Y.

 X  =  λ f. (λ x. x x) (λ x. f (x x))
Y'  =  (λ x y. x y x) (λ y x. y (x y x))
 Z  =  λ f. (λ x. f (λ v. x x v)) (λ x. f (λ v. x x v))
 Θ  =  (λ x y. y (x x y)) (λ x y. y (x x y))
  . . .

通常のためのベータ削減のunextended untypedラムダ計算、コンピュータの完全な書き換えシステム。

にウの定点combinatorのできる洗練の実施

fix :: forall t. (t -> t) -> t
fix f = f (fix f)

ウの怠惰ージ組版にfinity前にすべてのsubexpressions評価を行った。

primes :: Integral t => [t]
primes = sieve [2 ..]
   where
      sieve = fix (\ rec (p : ns) ->
                     p : rec [n | n <- ns
                                , n `rem` p /= 0])

Y-combinatorの実施匿名の再帰.その代わりに

function fib( n ){ if( n<=1 ) return n; else return fib(n-1)+fib(n-2) }

できない

function ( fib, n ){ if( n<=1 ) return n; else return fib(n-1)+fib(n-2) }

もちろん、y-combinatorにおける呼び名前です。を利用する場合はこの正常call-by-valueの言語の、それができない状態が生じたときの関連z-combinator(y-combinatorの一部を拡散/無限ループ).

としてのピるcombinatorsん マイクVanierの記事 (ニコラスMancusoする。書きたいと思ってい概要は、ほかの記録を理解ができるサービスを提供する企業理念等をどう受け取ったのでしょうか?してくれると嬉しいです。

から 友達少ァン

利用要因の例として、以下の almost-factorial 関数の算出要因の数 x:

def almost-factorial f x = if iszero x
                           then 1
                           else * x (f (- x 1))

の擬似コードを、 almost-factorial 取り機能 f 番号 x (almost-factorial で画廊かが考えられる機能 f 返1-arity機能)。

almost-factorial 階乗を計算した x, での代表者の計算の要因のために x - 1 機能 f に蓄積する結果 x (この場合において、増殖の結果は(x-1)x).

できとして almost-factorial 出かける 友達 版の因数分解能で計算まで数 x - 1)を返しま 下ァン 版の階乗を計算しま番号 x).しています。

almost-factorial crappy-f = less-crappy-f

した場合は繰り返しの 下ァン 版の要因に almost-factorial, まず私たちの取得希望因子の機能 f.できると:

almost-factorial f = f

修正点

この almost-factorial f = f 手段 f修正点 の機能 almost-factorial.

これは、本当にとても興味深い見え方に関係の機能上でのひと時でした。(必ずお読みくださいマイクのポストに固定点ださ)

三つの機能

を一般化して 非再帰的 機能 fn (当社のほとんど-要因)して、その 修正点 機能 fr (当社、その後何 Y な場合には、 Y fn, Y を返しますfix-ポイント機能の fn.

その概要(簡体字を想定して fr みつパラメータ; x 低下に x - 1, x - 2...に再帰):

  • この コア計算 として fn: def fn fr x = ...accumulate x with result from (fr (- x 1)), この ほとんど-有 機能が利用できません fn 直接 x, できます。この非再帰的 fn 使用機能 fr 計算結果
  • fn fr = fr, fr の固定点の fn, fr 関数使用できます frx を得るために結果
  • Y fn = fr, Y 返品の固定点の機能 Y が当社の ほとんど-有 機能 fn fr

Y (なし)

まskipの導出 Y への理解 Y.マイクVainerのポストは多い。

の形 Y

Y に定義される( ラムダ計算 形式:

Y f = λs.(f (s s)) λs.(f (s s))

まだまだ現役として活躍している変数 s 左の機能になりま

Y f = λs.(f (s s)) λs.(f (s s))
=> f (λs.(f (s s)) λs.(f (s s)))
=> f (Y f)

なので実際の結果 (Y f) の固定点の f.

なぜ (Y f) す。

によっては、署名の f, (Y f) できる機能のarityに、簡単にしましょうと (Y f) かつパラメータのように、当社の要因機能です。

def fn fr x = accumulate x (fr (- x 1))

以降 fn fr = fr, してきました

=> accumulate x (fn fr (- x 1))
=> accumulate x (accumulate (- x 1) (fr (- x 2)))
=> accumulate x (accumulate (- x 1) (accumulate (- x 2) ... (fn fr 1)))

を再帰的計算が終了するのは、ひとつの内で最も (fn fr 1) の場合には、 fn 使用していない fr に計上しています。

Y してもらうことを目的として

fr = Y fn = λs.(fn (s s)) λs.(fn (s s))
=> fn (λs.(fn (s s)) λs.(fn (s s)))

なので

fr x = Y fn x = fn (λs.(fn (s s)) λs.(fn (s s))) x

私にとっては、魔法のパーツのこのセットアップ:

  • fnfr interdepend互: fr 包' fn 内部で、毎時間 fr るために使用 x, でspawns'('フ'?) an fn および代表者の計算をする fn (通体 frx);一方で、 fn に依存 fr 利用し fr 計算結果の小さいものの問題 x-1.
  • 時に fr を定義するために使用され fnfn 用途 fr その操作)の実 fr な定義されています。
  • この fn を定義する実際のビジネスロジックに基づく fn, Y を作成し fr -ヘルパー関数には特定の形状を計算 fn a 再帰的 ます。

貸していただき大変便利でした理解 Y この瞬間にも役立っています。

ちなみに、私もの 入門プログラミングを通じてラムダ計算 とても良い部分だけを通して、僕の頭の周辺 Y につながっています。

こちらはへの回答 独自の質問, 統合から 記事 (理由に読むべきもの)の 答えによるニコラスMancuso, その他の回答:

何であるY-combinator?

するY-combinatorの"機能性"(高次機能—機能を運営する他の機能を取る単一引数に、関数だけるように、再帰を返しますバージョンのサイズを、ロボットの関節数にある列に変換します。


やや再帰=)が深まり、個人情報の定義について

A combinator—はただのラムダの発現のない変数です。
無料の変数は変動しないバウンドに変更します。
バ変数を変数に含まれる身体の内側のラムダ仕様の表現とその変数名の一つとして論争することができます。

別の言い方を考えることcombinatorそんなラムダ発現するための名称に置き換え、combinator、その定義は至る所で見てもまだ作業するので、断された場合に無限ループにcombinatorが含まれます自身への参照内のラムダ)

Y-combinatorが固定点combinator.

固定点の機能要素の機能ドメインにマップされているそのものの機能です。
とは言うものの、 c 固定点の機能 f(x) の場合 f(c) = c
この意味 f(f(...f(c)...)) = fn(c) = c

どのようなcombinatorsす。

以下に示す例と 強+動 タイピング:

Lazy(通常の順)Y-combinator:
この定義を適用言語とのぐもの:繰延話による)が必要となります)評価—評価戦略の遅れの評価の表現にまでその価値が必要です。

Y = λf.(λx.f(x x)) (λx.f(x x)) = λf.(λx.(x x)) (λx.f(x x))

つけることはしないということは、ある機能 f (非再帰関数に対応する再帰関数で取得できる最初に計算することにより、 λx.f(x x), し、このラムダ仕様の表現そのものです。

厳しい(応用のため)はY combinator:
この定義を適用言語は厳しいもの:も欲張りな評価—評価戦略における表現として評価するものとしますバインドされた可変となります。

Y = λf.(λx.f(λy.((x x) y))) (λx.f(λy.((x x) y))) = λf.(λx.(x x)) (λx.f(λy.((x x) y)))

でぐつで、自然でい λ 包装紙の遅延のラムダ仕様体の評価をします。私た 他の質問, ややこれに関連す。

佐村トミ】アクリルの心臓【オリ良いですか?

盗難に から借り 答えによるクリスAmmerman:Y-combinator generalizes再帰性,抽出、その実装を分離してから実際の仕事の機能に質問です。

でも、Y-combinatorには実践的なアプリケーションでは、主に理論的なコンセプトの理解の広がハイブリッドマネージャーは、可能性であるが、増分析、デベロッパーです。

はないのに有用な手続きですか?

として 記載したマイクVanier: 定義することが可能で、Y combinatorの多くの静的型付き言語のもの(少なくともいくつかの例を見てき)などを定義することが必要となるためのいくつかの非自明であ型hackeryのY combinator自体はあまりないのか静的タイプです。ことになる範囲を超えて、この条の規なんですが、この点について言及さ

として 上記によるクリスAmmerman:最手続きの言語は、静的-文字を入力す

その答えはどこかをしなければいけません。

は、不動点演算子は固定ポイントオペレーター)では、より高次な機能を計算する固定点のその他の機能.この操作は、関連するプログラミング言語理論できるようにするために、実施の再帰形式に書き換え規則なく、明示的な支援からの言語の実行時のエンジンです。(src Wikipedia)

は、このオペレーターなどを簡略化できたの人生:

var Y = function(f) {
    return (function(g) {
        return g(g);
    })(function(h) {
        return function() {
            return f.apply(h(h), arguments);
        };
    });
};

それを回避するための追加機能:

var fac = Y(function(n) {
    return n == 0 ? 1 : n * this(n - 1);
});

最後に呼び出す fac(5).

私の答えは、言語のように、JavaScript:

function factorial(num)
{
    // If the number is less than 0, reject it.
    if (num < 0) {
        return -1;
    }
    // If the number is 0, its factorial is 1.
    else if (num == 0) {
        return 1;
    }
    // Otherwise, call this recursive procedure again.
    else {
        return (num * factorial(num - 1));
    }
}

現在書き換えるように使用していませんので関数名の機能のものと同じものを見ることができない再帰的に.

唯一の場所での機能名称 factorial されるべきであるが、コールサイトです。

ヒント:使用できませんの名称機能が利用できる名前のパラメータ。

仕事の問題です。などがあります。一度解決で参りますので、ご理解の程、何か問題のy combinatorを解決す.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top