حاولت أن تستمد Z combinator وبدلا مشتقة أخرى
-
29-09-2020 - |
سؤال
كنت أعمل لاستخلاص 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)))