سؤال

كنت أعمل لاستخلاص Z-Combinator من خلال البدء مع مضروب وظيفة وانتهى اشتقاق مختلفة النقطة الثابتة combinator.ما لم تستمد?هل قمت بعمل خفية الخطأ ؟

وهنا هي الخطوات التي يؤديها (في جافا سكريبت)

1.إعلان وظيفة مضروب

let fact = n =>
    n < 2 ? 1 : n * fact(n - 1)

2.تحويل إلى combinator (مغلقة التعبير)

let fact = (self, n) =>
    n < 2 ? 1 : n * self(n - 1)

3.موضوع الذاتي الدعوة

على أساس التوقيع fact(?, 7), مرورا fact كما الوسيطة الأولى يبدو معقولا fact(fact,7).حتى موضوع المعلمة من خلال الذيل الاتصال:

let fact = (self, n) =>
    n < 2 ? 1 : n * self(self, n - 1)

الاستخدام الآن fact(fact,7)5040

4.ريفاكتور إلى بالكاري شكل

let fact = self =>
    n => n < 2 ? 1 : n * self(self)(n - 1)

5.تتحرك النفس إلى تطبيق إعلان المحلية

let fact = self => {
    let f = n => self(self)(n)
    return n => n < 2 ? 1 : n * f(n - 1)
}

6.تحويل السماح الإعلان التعبير امدا

let fact = self =>
    (f =>
        n => n < 2 ? 1 : n * f(n - 1)
    )(
        n => self(self)(n)
    )

الاستخدام لا يزال fact(fact)(7)5040

7.فصل مضروب التعبير

let _fact = f => n =>
    n < 2 ? 1 : n * f(n - 1)

let fact = self =>
    (
        _fact
    )(
        n => self(self)(n)
    )

8.نقل التطبيق الذاتي من المتصل إلى الجسم

let _fact =
    f => n => n < 2 ? 1 : n * f(n - 1)

let fact = (() => {
    let innerFact = self =>
        (
            _fact
        )(
            n => self(self)(n)
        )
    return innerFact(innerFact)
})()

الاستخدام الآن fact(7)5040

9.تحويل السماح الإعلان التعبير امدا

let _fact =
    f => n => n < 2 ? 1 : n * f(n - 1)

let fact = (() => {
    return (
        innerFact => innerFact(innerFact)
    )(
        self => (_fact)(n => self(self)(n))
    )
})()

10.تبسيط التعبير

let _fact =
    f => n => n < 2 ? 1 : n * f(n - 1)

let fact =
    (innerFact => innerFact(innerFact))
    (self => (_fact)(n => self(self)(n)))

التعقل تحقق.الاستخدام لا يزال fact(7)5040

11.إعادة تسمية المتغيرات

استخدام innerFact و self تبدو مشابهة بشكل مثير للريبة.إعادة تسمية إلى نفس المتغير إلى اكتشاف نمط.منفصلة المعجمية نطاقات آمنة جدا القيام به:

let _fact =
    f => n => n < 2 ? 1 : n * f(n - 1)

let fact =
    (u => u(u))
    (u => (_fact)(n => u(u)(n)))

12.مجردة _fact الاستخدام وإعادة تسمية fact

إعادة تسمية fact إلى setup و مجردة ، _fact في الجسم عن طريق استبدال مع المعلمة f

let _fact =
    f => n => n < 2 ? 1 : n * f(n - 1)

let setup = f =>
    (u => u(u))
    (u => (f)(n => u(u)(n)))

let fact = setup(_fact)

لا حاجة منفصلة _fact إعلان المضمنة ذلك:

let setup = f =>
    (u => u(u))
    (u => (f)(n => u(u)(n)))

let fact = setup(
    f => n => n < 2 ? 1 : n * f(n - 1)
)

13.إعادة تسمية setup

تسميته إلى ماذا ؟ ما combinator هذا ؟ وفقا ويكيبيديا Z combinator هو:

let Z = f => 
    (u => f(v => u(u)(v)))
    (u => f(v => u(u)(v)))

ولكن ما كنت المشتقة هي:

let setup = f =>
    (u => u(u))
    (u => (f)(n => u(u)(n)))

تعريف fact سواء من حيث يبدو ما يعادلها في السلوك.هل قمت بعمل خطأ ؟ هل قصد اكتشاف آخر معروف combinator?

هل كانت مفيدة؟

المحلول

إذا كنت مضمنة (u => (f)(n => u(u)(n))) في (u => u(u)) أحصل على:

(u => f(n => u(u)(n)))
(u => f(n => u(u)(n)))

وهو بالضبط Z-Combinator.

من ويكيبيديا:

let Z = f => 
    (u => f(v => u(u)(v)))
    (u => f(v => u(u)(v)))

بلدي الاشتقاق:

let fix = f =>
    (u => f(n => u(u)(n)))
    (u => f(n => u(u)(n)))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى cs.stackexchange
scroll top