سؤال

لقد قرأت مقالة ويكيبيديا عن رد الفعل البرمجة.أنا أيضا قراءة المقالة الصغيرة على وظيفية رد الفعل البرمجة.الوصف مجردة تماما.

  1. ماذا وظيفية رد الفعل البرمجة (FRP) يعني في الممارسة العملية ؟
  2. ما رد الفعل البرمجة (في مقابل عدم رد الفعل البرمجة؟) تتكون من ؟

خلفيتي في حتمية/OO اللغات ، لذلك تفسيرا يتعلق هذا النموذج سيكون موضع تقدير.

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

المحلول

إذا كنت ترغب في الحصول على شعور FRP ، يمكن أن تبدأ مع القديم فران التعليمي من عام 1998 ، التي لديها الرسوم المتحركة التوضيحية.للأوراق, تبدأ الوظيفية التفاعلية والرسوم المتحركة ثم متابعة الروابط على المنشورات رابط على الصفحة الرئيسية فرب الرابط على هاسكل ويكي.

شخصيا, أنا أحب أن نفكر في ما FRP يعني قبل التطرق إلى كيفية تنفيذها.(رمز بدون مواصفات الجواب دون السؤال وبالتالي "لا خطأ".) لذا لا تصف فرب في التمثيل/تنفيذ الشروط مثل توماس ك لا في جواب آخر (الرسوم البيانية, العقد, حواف, اطلاق, تنفيذ, الخ).هناك العديد من إمكانية تنفيذ الأساليب ، ولكن لا تنفيذ تقول ما FRP هو.

أنا لا يتردد صداها مع لورانس ز بسيطة وصف فرب عن "أنواع البيانات التي تمثل القيمة على مر الزمن ".التقليدية البرمجة حتمية يجسد هذه القيم الديناميكية بشكل غير مباشر فقط من خلال الدولة الطفرات.الكامل في التاريخ (الماضي ، الحاضر ، المستقبل) لا يوجد لديه الدرجة الأولى في التمثيل.وعلاوة على ذلك, فقط بتحفظ المتطورة يمكن أن تكون القيم (بشكل غير مباشر) القبض منذ حتمية النموذج هو زمنيا منفصلة.في المقابل, فرب يلتقط هذه المتطورة القيم مباشرة و لا يوجد لديه صعوبة في باستمرار تطور القيم.

فرب هو أيضا غير عادية في أنه المتزامنة دون نخالف النظرية و الواقعية عش الجرذان التي ابتليت ضرورة التزامن.لغويا ، فرب هذا التزامن هو غرامة الحبيبات, بعوض, ، المستمر.(أنا أتحدث عن معنى لا تنفيذ.التنفيذ قد أو قد لا تنطوي على التزامن أو التوازي.) الدلالي determinacy مهم جدا عن المنطق ، سواء دقيق أو غير الرسمية.في حين التزامن يضيف هائلة التعقيد إلى ضرورة البرمجة (بسبب غير حتمى التداخل) ، بل هو جهد في FRP.

فما هو FRP ؟ هل يمكن أن يكون اخترع ذلك بنفسك.نبدأ مع هذه الأفكار:

  • ديناميكية/تطور القيم (أي القيم "مع مرور الوقت") هي أول فئة القيم في أنفسهم.يمكنك تحديد لهم والجمع بينهما وتمريرها إلى & من الوظائف.اتصلت هذه الأمور "السلوكيات".

  • السلوكيات يتم بناؤها من بعض الأوليات مثل ثابت (ثابت) سلوكيات الوقت (مثل الساعة) ثم مع متتابعة و بالتوازي مع الجمع. n السلوكيات هي مجتمعة من خلال تطبيق n-ary وظيفة (على قيم ثابتة) ، "نقطة الحكيم" ، أي بشكل مستمر مع مرور الوقت.

  • لحساب ظاهرة منفصلة ، نوع آخر (الأسرة) من "الأحداث" ، كل منها يحتوي على تيار (محدود أو غير محدود) من الحوادث.كل حدث مقترن الوقت والقيمة.

  • يأتي مع التركيبي المفردات من جميع السلوكيات والأحداث يمكن أن يبنى ، تلعب مع بعض الأمثلة.الحفاظ على تفكيك إلى قطع أكثر العامة/بسيط.

  • حتى أن كنت تعلم أنك على أرض صلبة ، وإعطاء كل نموذج التركيبية الأساس ، وذلك باستخدام تقنية denotational دلالات ، مما يعني أن (أ) كل نوع لديه المقابلة بسيطة ودقيقة الرياضية نوع من "المعاني" ، و (ب) كل بدائية المشغل بسيطة ودقيقة معنى دالة على المعاني من الناخبين.أبدا مزيج اعتبارات التنفيذ في طور الاستكشاف.إذا كان هذا الوصف هو رطانة لك استشارة (أ) Denotational التصميم مع نوع الطبقة morphisms, و (ب) دفع سحب وظيفية رد الفعل البرمجة (تجاهل تنفيذ بت), و (ج) Denotational دلالات هاسكل صفحة ويكي الكتب.حذار أن denotational دلالات جزأين من اثنين من المؤسسين كريستوفر Strachey و دانا سكوت:أسهل وأكثر فائدة Strachey جزء أصعب وأقل فائدة (على تصميم البرمجيات) سكوت جزء.

إذا كنت العصا مع هذه المبادئ أتوقع الحصول على شيء أكثر أو أقل في روح FRP.

من أين حصلت على هذه المبادئ ؟ في تصميم البرمجيات ، أنا دائما أسأل نفس السؤال:"ماذا تعني؟".Denotational دلالات أعطاني دقيقا إطار هذا السؤال و الذي يناسب بلدي الجمال (على عكس التنفيذية أو البديهي دلالات ، وكلاهما ترك لي غير راض).لذلك سألت نفسي ما هو السلوك ؟ وسرعان ما أدركت أن زمنيا منفصلة طبيعة حتمية الحساب هو الإقامة على نمط معين من آلة, بدلا من الطبيعية وصف السلوك نفسه.أبسط وصف دقيق السلوك يمكنني التفكير به هو مجرد "وظيفة (مستمر) الوقت" ، هذا هو النموذج.مبهج هذا نموذج مقابض المستمر ، القطعية التزامن مع سهولة ونعمة.

لقد كان تحديا كبيرا لتنفيذ هذا النموذج بشكل صحيح وفعال, ولكن تلك قصة أخرى.

نصائح أخرى

في نقي البرمجة الوظيفية ، هناك أي آثار جانبية.لأنواع عديدة من البرامج (على سبيل المثال ، أي شيء مع تفاعل المستخدم) الآثار الجانبية ضرورية في بعض المستوى.

طريقة واحدة للحصول على الآثار الجانبية مثل السلوك في حين لا يزال الإبقاء على نمط وظيفي هو استخدام وظيفية رد الفعل البرمجة.هذا هو مزيج من البرمجة الوظيفية رد الفعل البرمجة.(مقالة ويكيبيديا كنت مرتبطة عن هذا الأخير.)

الفكرة الأساسية وراء رد الفعل البرمجة هو أن هناك بعض أنواع البيانات التي تمثل قيمة "مع مرور الوقت".الحسابات التي تنطوي على هذه المتغيرة عبر الزمن القيم نفسها القيم التي تتغير مع مرور الوقت.

على سبيل المثال ، يمكن أن تمثل إحداثيات الماوس كما زوج من عدد صحيح على قيم الوقت.دعونا نقول لدينا شيء مثل (هذا هو الزائفة رمز):

x = <mouse-x>;
y = <mouse-y>;

في أي لحظة في الوقت المناسب ، x و y قد إحداثيات الماوس.على عكس غير رد الفعل البرمجة ، ونحن بحاجة فقط إلى جعل هذه المهمة مرة واحدة ، و x و y المتغيرات البقاء "حتى الآن" تلقائيا.هذا هو السبب في رد الفعل البرمجة و البرمجة الوظيفية تعمل بشكل جيد معا:رد الفعل البرمجة يزيل الحاجة إلى التحور المتغيرات في حين لا يزال السماح كنت تفعل الكثير من ما يمكن تحقيقه مع متغير الطفرات.

إذا كنا ثم القيام ببعض العمليات الحسابية على أساس هذه القيم الناتجة سوف تكون أيضا القيم التي تتغير مع مرور الوقت.على سبيل المثال:

minX = x - 16;
minY = y - 16;
maxX = x + 16;
maxY = y + 16;

في هذا المثال ، minX سوف تكون دائما 16 أقل من × إحداثيات مؤشر الماوس.مع رد الفعل-علم المكتبات ثم يمكن أن تقول شيئا مثل:

rectangle(minX, minY, maxX, maxY)

و 32 × 32 مربع سيتم رسمها حول مؤشر الماوس وسوف تعقبها أينما تحرك.

هنا هو جيد جدا ورقة وظيفية رد الفعل البرمجة.

طريقة سهلة للوصول إلى أول الحدس عن ما هو عليه مثل أن تتخيل البرنامج هو جدول جميع المتغيرات الخلايا.إذا كان أي من الخلايا في جدول بيانات التغيير ، أي الخلايا التي تشير إلى تلك الخلية التغيير.إنه مجرد واحد مع FRP.الآن تخيل أن بعض الخلايا تتغير من تلقاء نفسها (أو بالأحرى ، تؤخذ من العالم الخارجي):في واجهة المستخدم الرسومية الوضع ، وضع الماوس سيكون خير مثال على ذلك.

التي بالضرورة يفتقد بدلا من ذلك الكثير.استعارة ينهار بسرعة عندما كنت في الواقع استخدام فرب النظام.واحد, عادة ما تكون هناك محاولات نموذج منفصلة الأحداث وكذلك (على سبيل المثالالماوس يتم النقر عليها).أنا أضع هذا فقط هنا أن أعطيكم فكرة عن ما هو عليه.

بالنسبة لي هو حوالي 2 معاني الرمز =:

  1. في الرياضيات x = sin(t) يعني هذا x هو اسم مختلف بالنسبة sin(t).حتى كتابة x + y هو نفس الشيء sin(t) + y.وظيفية رد الفعل البرمجة مثل الرياضيات في هذا الصدد:إذا كنت أكتب x + y, هو محسوب مع أي قيمة t في الوقت الذي يتم استخدامه.
  2. في ج-مثل لغات البرمجة (حتمية لغات) ، x = sin(t) هو مهمة:فهذا يعني أن x يخزن قيمة sin(t) التي اتخذت في وقت الإحالة.

حسنا, من المعارف الأساسية من قراءة صفحة ويكيبيديا التي أشار يبدو أن رد الفعل البرمجة هو شيء مثل تدفق البيانات الحوسبة ولكن مع خارجية محددة "المحفزات" مما اثار مجموعة من العقد إلى النار وإجراء الحسابات الخاصة بهم.

هذا هو جدا مناسبة تماما تصميم واجهة المستخدم, على سبيل المثال, الذي لمس التحكم واجهة المستخدم (أقول التحكم بحجم الصوت على الموسيقى التطبيق) قد تحتاج إلى تحديث مختلف عناصر العرض و الحجم الفعلي إخراج الصوت.عند تعديل حجم (a المنزلق, دعنا نقول) التي من شأنها أن تتوافق مع تعديل القيمة المرتبطة عقدة في توجيه الرسم البياني.

مختلف العقد وجود حواف من أن "حجم القيمة" عقدة تلقائيا تشغيل أي الحسابية اللازمة و التحديثات بشكل طبيعي تموج من خلال التطبيق.تطبيق "يتفاعل" للمستخدم التحفيز.وظيفية رد الفعل البرمجة سيكون تنفيذ هذه الفكرة في لغة وظيفية ، أو عموما داخل وظيفية نموذج البرمجة.

لمزيد من المعلومات حول "البيانات الحاسوبية" ، البحث عن تلك الكلمتين في ويكيبيديا أو باستخدام محرك البحث المفضل لديك.الفكرة العامة هي:البرنامج هو الرسم البياني موجهة من العقد ، كل إجراء بعض بسيطة حساب.هذه العقد ترتبط مع بعضها البعض من خلال الرسم البياني الروابط التي توفر مخرجات بعض العقد إلى مدخلات من الآخرين.

عندما عقدة الحرائق أو ينفذ حسابها العقد متصلا النواتج المقابل المدخلات "تشغيل" أو "علامة".أي عقدة وجود جميع مدخلات تشغيل/ملحوظة/متوفرة تلقائيا الحرائق.الرسم البياني قد تكون صريحة أو ضمنية اعتمادا على بالضبط كيف رد الفعل برمجة تنفيذها.

يمكن أن يكون العقد بدأ في إطلاق النار في موازاة ذلك ، ولكن في كثير من الأحيان يتم تنفيذها بشكل متسلسل أو محدودة التوازي (على سبيل المثال ، قد يكون هناك عدد قليل من المواضيع تنفيذها).الشهيرة على سبيل المثال ، مانشستر امتحان آلة, الذي (IIRC) تستخدم الموسومة بنية البيانات إلى جدول تنفيذ العقد في الرسم البياني من خلال واحدة أو أكثر من وحدات التنفيذ.امتحان الحوسبة إلى حد ما يناسب المواقف التي تسبب الحسابية بشكل غير متزامن مما أدى إلى شلالات من حسابات يعمل بشكل أفضل من محاولة إعدام يحكمها الساعة (أو الساعات).

رد الفعل البرمجة الواردات هذا "سلسلة من تنفيذ فكرة" ويبدو أن التفكير في البرنامج في تدفق البيانات-مثل الأزياء ولكن بشرط أن بعض العقد مدمن مخدرات إلى "العالم الخارجي" و شلالات التنفيذ يتم تشغيلها عند هذه الحسية مثل العقد التغيير.تنفيذ البرنامج ثم تبدو وكأنها شيء مماثل مجمع القوس الانعكاسي.البرنامج قد تكون أو لا تكون أساسا لاطئة بين المحفزات أو قد يستقر في الأساس لاطئة الدولة بين المحفزات.

"غير رد الفعل" البرمجة ستكون البرمجة مع وجهة نظر مختلفة جدا من تدفق التنفيذ علاقة المدخلات الخارجية.فمن المحتمل أن يكون موضوعي إلى حد ما ، حيث من المرجح أن يميل إلى قول أي شيء أن يستجيب المدخلات الخارجية "يتفاعل" لهم.ولكن بالنظر إلى روح الشيء, برنامج استطلاعات الرأي الحدث الانتظار في فترات زمنية ثابتة و ترسل أي أحداث العثور على وظائف (أو المواضيع) هو أقل رد الفعل (لأنه فقط يحضر إلى إدخال المستخدم في فترات زمنية ثابتة).مرة أخرى, انها روح الشيء هنا:يمكن للمرء أن يتصور وضع الاقتراع مع تنفيذ سريع الفاصل الزمني للاستقصاء في النظام على مستوى منخفض جدا و برنامج في رد الفعل الأزياء على أعلى من ذلك.

بعد قراءة العديد من الصفحات عن فرب وأخيرا جاء عبر هذا المنير في الكتابة عن فرب أخيرا جعلني أفهم ما فرب هو حقا كل شيء عن.

أقتبس أدناه هاينريش Apfelmus (المؤلف من رد الفعل الموز).

ما هو جوهر وظيفية رد الفعل البرمجة ؟

مشترك يكون الجواب أن "فرب كل شيء عن واصفا النظام في حيث الوقت-وظائف مختلفة بدلا من قابلة للتغيير الدولة" ، بالتأكيد لن يكون من الخطأ.هذا هو الدلالي وجهة نظر.ولكن في رأيي أعمق وأكثر يجيب تعطى من قبل بعد بحتة النحوية المعيار:

جوهر وظيفية رد الفعل البرمجة هي تحديد السلوك الديناميكي القيمة تماما في وقت الإعلان.

على سبيل المثال, لنأخذ على سبيل المثال العداد:لديك اثنين من الأزرار المسمى "حتى" و "القاعدة" والتي يمكن استخدامها لزيادة أو إنقاص العداد.حتما أنت أولا تحديد قيمة أولية ومن ثم تغييره عندما يتم الضغط على زر;شيء من هذا القبيل:

counter := 0                               -- initial value
on buttonUp   = (counter := counter + 1)   -- change it later
on buttonDown = (counter := counter - 1)

وهذه النقطة هي أنه في وقت من الإعلان فقط القيمة الأولية بالنسبة العداد المحددة ؛ السلوك الديناميكي من العداد ضمني في بقية نص البرنامج.في المقابل, وظيفية رد الفعل البرمجة تحدد كله السلوك الديناميكي في ذلك الوقت من إعلان مثل هذا:

counter :: Behavior Int
counter = accumulate ($) 0
            (fmap (+1) eventUp
             `union` fmap (subtract 1) eventDown)

كلما كنت ترغب في فهم ديناميات مكافحة, لديك فقط أن ننظر إلى تعريفه.كل شيء يمكن أن يحدث وسوف تظهر على الجانب الأيمن.وهذا كثير جدا في المقابل حتمية النهج حيث التصريحات اللاحقة يمكن تغيير السلوك الديناميكي أعلن سابقا القيم.

لذلك ، فهمي وهو فرب البرنامج هو مجموعة من المعادلات:enter image description here

j غير منفصلة:1,2,3,4...

f يعتمد على t لذلك هذا يتضمن possiblilty إلى نموذج للمؤثرات الخارجية

كل دولة من البرنامج يتم تغليف في المتغيرات x_i

على فرب مكتبة يعتني تتقدم الوقت ، وبعبارة أخرى ، مع j إلى j+1.

اشرح هذه المعادلات في أكثر من ذلك بكثير من التفصيل في هذا فيديو.

تحرير:

عن 2 سنة بعد الرد الأصلي مؤخرا جئت إلى استنتاج مفاده أن فرب تطبيقات لها جانب مهم آخر.فإنها تحتاج إلى (عادة) حل مشكلة عملية هامة: إبطال ذاكرة التخزين المؤقت.

معادلات x_i-s لوصف الاعتماد على الرسم البياني.عند بعض x_i التغييرات في الوقت j ثم ليس كل أخرى x_i' القيم في j+1 تحتاج إلى تحديث ، لذلك ليس كل التبعيات تحتاج إلى أن يكون حساب لأن بعض x_i' قد تكون مستقلة عن x_i.

وعلاوة على ذلك ، x_i-s أن التغيير يمكن أن يكون تدريجيا تحديث.على سبيل المثال دعونا النظر في خريطة العملية f=g.map(_+1) في سكالا ، حيث f و g هي List من Ints.هنا f يتوافق مع x_i(t_j) و g هو x_j(t_j).الآن إذا كنت prepend عنصرا g ثم أنه سيكون من الإسراف لتنفيذ map العملية لجميع العناصر في g.بعض فرب تطبيقات (على سبيل المثال رد الفعل فرب) تهدف إلى حل هذه المشكلة.هذه المشكلة كما هو معروف تدريجي الحوسبة.

وبعبارة أخرى, السلوكيات (على x_i-s ) في فرب يمكن التفكير ذاكرة التخزين المؤقت -- إد الحسابية.فمن مهمة فرب المحرك بكفاءة يبطل و حساب هذه ذاكرة التخزين المؤقت-s ( x_i-s) إذا كان بعض f_i-s لا تتغير.

ورقة ببساطة كفاءة وظيفية التفاعل قبل كونال إليوت (مباشر PDF, 233 KB) هو مقدمة جيدة إلى حد ما.المقابلة مكتبة يعمل أيضا.

الورق الآن تعليماتها إلى آخر الورقة ، دفع سحب وظيفية رد الفعل البرمجة (مباشر PDF, 286 KB).

تنويه:جوابي هو في سياق rx.js - a 'رد الفعل البرمجة' مكتبة جافا سكريبت.

في البرمجة الوظيفية بدلا من بالتكرار من خلال كل عنصر من مجموعة تطبيق أعلى الوظائف (HoFs) إلى المجموعة نفسها.لذا فإن الفكرة وراء فرب هو أنه بدلا من معالجة كل حدث على حدة ، وخلق تيار الأحداث (تنفذ مع ملاحظتها*) وتطبيق HoFs إلى أنه بدلا من ذلك.بهذه الطريقة يمكنك تصور نظام بيانات خطوط الأنابيب التي تربط الناشرين المشتركين.

أهم مزايا استخدام ملاحظتها هي:
ط) ملخصات بعيدا الدولة من التعليمات البرمجية الخاصة بك ، على سبيل المثال ، إذا كنت تريد معالج الحدث من أجل الحصول على النار فقط كل 'ن يستحق الحدث ، أو وقف إطلاق النار بعد أول 'n' الأحداث أو بدء إطلاق النار فقط بعد أول 'n' الأحداث ، يمكنك فقط استخدام HoFs (مرشح ، takeUntil تخطي على التوالي) بدلا من إعداد وتحديث فحص العدادات.
الثاني) أنه يحسن رمز محلية - إذا كان لديك 5 مختلفة معالجات الأحداث تغيير الدولة من مكون, يمكنك دمج الطيران على علو وتحديد واحد معالج الحدث على دمج ملاحظتها بدلا من ذلك على نحو فعال بين 5 معالجات الأحداث إلى 1.هذا يجعل من السهل جدا أن السبب حول ما الأحداث في كامل النظام الخاص بك يمكن أن تؤثر على عنصر ، حيث أنها موجودة في معالج واحد.

  • الملحوظ هو المزدوجة من Iterable.

وهو Iterable هو بتكاسل المستهلكة تسلسل كل بند يتم سحبها عن طريق التكرار كلما يريد استخدامه ، وبالتالي التعداد مدفوعة من قبل المستهلك.

الملحوظ هو بتكاسل أنتجت سلسلة - كل عنصر دفع المراقبين كلما إضافة إلى التسلسل ، وبالتالي التعداد مدفوعة من قبل المنتج.

يا صاح, هذا هو ينقط فكرة رائعة!لماذا لم يكتشف هذا مرة أخرى في عام 1998 ؟ على أى حال هذا هو تفسير فران البرنامج التعليمي.اقتراحات هي موضع ترحيب, أنا أفكر في بدء محرك اللعبة على أساس هذا.

import pygame
from pygame.surface import Surface
from pygame.sprite import Sprite, Group
from pygame.locals import *
from time import time as epoch_delta
from math import sin, pi
from copy import copy

pygame.init()
screen = pygame.display.set_mode((600,400))
pygame.display.set_caption('Functional Reactive System Demo')

class Time:
    def __float__(self):
        return epoch_delta()
time = Time()

class Function:
    def __init__(self, var, func, phase = 0., scale = 1., offset = 0.):
        self.var = var
        self.func = func
        self.phase = phase
        self.scale = scale
        self.offset = offset
    def copy(self):
        return copy(self)
    def __float__(self):
        return self.func(float(self.var) + float(self.phase)) * float(self.scale) + float(self.offset)
    def __int__(self):
        return int(float(self))
    def __add__(self, n):
        result = self.copy()
        result.offset += n
        return result
    def __mul__(self, n):
        result = self.copy()
        result.scale += n
        return result
    def __inv__(self):
        result = self.copy()
        result.scale *= -1.
        return result
    def __abs__(self):
        return Function(self, abs)

def FuncTime(func, phase = 0., scale = 1., offset = 0.):
    global time
    return Function(time, func, phase, scale, offset)

def SinTime(phase = 0., scale = 1., offset = 0.):
    return FuncTime(sin, phase, scale, offset)
sin_time = SinTime()

def CosTime(phase = 0., scale = 1., offset = 0.):
    phase += pi / 2.
    return SinTime(phase, scale, offset)
cos_time = CosTime()

class Circle:
    def __init__(self, x, y, radius):
        self.x = x
        self.y = y
        self.radius = radius
    @property
    def size(self):
        return [self.radius * 2] * 2
circle = Circle(
        x = cos_time * 200 + 250,
        y = abs(sin_time) * 200 + 50,
        radius = 50)

class CircleView(Sprite):
    def __init__(self, model, color = (255, 0, 0)):
        Sprite.__init__(self)
        self.color = color
        self.model = model
        self.image = Surface([model.radius * 2] * 2).convert_alpha()
        self.rect = self.image.get_rect()
        pygame.draw.ellipse(self.image, self.color, self.rect)
    def update(self):
        self.rect[:] = int(self.model.x), int(self.model.y), self.model.radius * 2, self.model.radius * 2
circle_view = CircleView(circle)

sprites = Group(circle_view)
running = True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        if event.type == KEYDOWN and event.key == K_ESCAPE:
            running = False
    screen.fill((0, 0, 0))
    sprites.update()
    sprites.draw(screen)
    pygame.display.flip()
pygame.quit()

باختصار:إذا كان كل عنصر يمكن أن تعامل مثل عدد, كل نظام يمكن علاجها مثل معادلة رياضية, صحيح ؟

بول هوداك هذا الكتاب ، هاسكل المدرسة التعبير, ليس فقط غرامة مقدمة هاسكل, ولكن كما أن تنفق قدرا كبيرا من الوقت على FRP.إذا كنت مبتدئا مع فرب أنا أوصي به أن تعطيك إحساس كيف فرب يعمل.

هناك أيضا ما يشبه الجديدة كتابة هذا الكتاب (صدر عام 2011 ، تحديث عام 2014) ، هاسكل مدرسة الموسيقى.

وفقا الأجوبة السابقة ، يبدو أن رياضيا ، ببساطة نفكر في أعلى الترتيب.بدلا من التفكير في قيمة x وجود نوع X, نعتقد وظيفة x: TX, حيث T هو نوع من الوقت ، سواء كانت الأعداد الطبيعية ، الصحيحه أو التواصل.الآن عندما نكتب y := x + 1 في لغة البرمجة ، ونحن في الواقع يعني المعادلة y(t) = x(t) + 1.

يتصرف مثل جدول بيانات كما لوحظ.عادة على أساس الحدث مدفوعة الإطار.

كما هو الحال مع كل "النماذج" إنها حداثة هو قابل للنقاش.

من تجربتي توزيع تدفق شبكات من الجهات الفاعلة ، يمكن أن تقع بسهولة فريسة مشكلة عامة من الدولة الاتساق عبر شبكة من العقد أيكنت في نهاية المطاف مع الكثير من التذبذب و محاصرة في غريب الحلقات.

هذا من الصعب تجنب بعض دلالات يعني المرجعي الحلقات أو البث ، يمكن أن تكون فوضوية مثل شبكة من الجهات الفاعلة يتقاطع (أو لا) على بعض لا يمكن التنبؤ بها الدولة.

وبالمثل ، فإن بعض الدول قد لا تكون وصلت, على الرغم من وجود حواف محددة جيدا ، لأن الدولة العالمية يرسم بعيدا عن الحل.2+2 قد أو قد لا تحصل على 4 اعتمادا على عندما 2 أصبح 2 إذا بقيت على هذا الطريق.جداول البيانات يكون متزامن الساعات حلقة الكشف.توزيع الفاعلة عموما لا.

كل متعة جيدة :).

لقد وجدت هذا الفيديو لطيفة على Clojure subreddit عن FRP.فمن السهل جدا أن نفهم حتى إذا كنت لا تعرف Clojure.

هنا هو الفيديو: http://www.youtube.com/watch?v=nket0K1RXU4

وهنا مصدر الفيديو يشير إلى في النصف 2: https://github.com/Cicayda/yolk-examples/blob/master/src/yolk_examples/client/autocomplete.cljs

هذه المادة بواسطة اندريه Staltz هو أفضل و أوضح تفسير رأيت حتى الآن.

بعض مقتطفات من المقال:

رد الفعل البرمجة البرمجة غير المتزامنة البيانات والجداول.

على أعلى من ذلك ، يتم إعطاء مذهلة أدوات المهام إلى الجمع ، إنشاء عامل تصفية أي من تلك الجداول.

هنا مثال رائع المخططات التي هي جزء من المقال:

Click event stream diagram

فمن حول البيانات الرياضية التحولات مرور الوقت (أو تجاهل ذلك الوقت).

في رمز هذا يعني وظيفية النقاء التعريفي البرمجة.

الدولة الحشرات مشكلة كبيرة في مستوى بد من النموذج.مختلف أجزاء من التعليمات البرمجية قد تتغير بعض مشتركة الدولة في مختلف "تايمز" في برامج التنفيذ.هذا من الصعب التعامل مع.

في فرب تصفون (مثل التعريفي البرمجة) كيف يحول البيانات من دولة إلى أخرى و ما يسببه.هذا يسمح لك أن تتجاهل الوقت لأن وظيفة الخاص بك هو مجرد رد فعل لها المدخلات باستخدام القيم الحالية إلى إنشاء واحدة جديدة.وهذا يعني أن الدولة هي الواردة في الرسم البياني (أو شجرة) من التحول والعقد وظيفيا النقي.

هذا على نطاق واسع يقلل من تعقيد التصحيح الوقت.

فكر في الفرق بين A=B+C في الرياضيات و A=B+C في البرنامج.في الرياضيات كنت تصف العلاقة التي لن تتغير أبدا.في البرنامج ، يقول "الآن" A B+C.ولكن الأمر التالي قد يكون ب++ في هذه الحالة A لا يساوي B+C.في الرياضيات أو التقريرية برمجة سوف يكون دائما مساويا ب+ج بغض النظر عن أي نقطة في الوقت المناسب كنت تسأل.

وذلك عن طريق إزالة التعقيدات المشتركة الدولة وتغيير القيم مع مرور الوقت.هل البرنامج هو أسهل بكثير عن سبب.

وهو EventStream هو EventStream + بعض التحول وظيفة.

السلوك هو EventStream + بعض القيمة في الذاكرة.

عندما وقع حدث القيمة تحديث عن طريق تشغيل وظيفة التحول.القيمة التي تنتج هذه المخزنة في السلوكيات الذاكرة.

السلوكيات يمكن أن تتكون في إنتاج كميات جديدة من السلوكيات التي تحول على ن سلوكيات أخرى.هذا وتتألف قيمة حساب كإدخال الأحداث (السلوكيات) النار.

"منذ المراقبين عديمي الجنسية ، ونحن غالبا ما تحتاج العديد منهم لمحاكاة آلة الدولة كما في السحب سبيل المثال.علينا أن ننقذ الدولة حيث يمكن الوصول إلى جميع المعنيين والمراقبين مثل في متغير المسار أعلاه."

اقتباس من استنكر المراقب نمط http://infoscience.epfl.ch/record/148043/files/DeprecatingObserversTR2010.pdf

قصيرة و تفسير واضح حول رد الفعل البرمجة يظهر على Cyclejs - رد الفعل البرمجة, يستخدم بسيطة و البصرية العينات.

A [وحدة/مكون/object] هو رد الفعل ما يعني أنها مسؤولة بشكل كامل لإدارة دولته عن طريق الاستجابة إلى الأحداث الخارجية.

ما هي الفائدة من هذا النهج ؟ فمن انعكاس السيطرة, وذلك أساسا بسبب [وحدة/مكون/object] هي المسؤولة عن نفسها ، وتحسين التغليف باستخدام طرق خاصة ضد العامة منها.

هو بدء التشغيل النقطة ليست كاملة مصدر المعرفة.من هناك يمكنك أن تقفز إلى أكثر تعقيدا ورقات عميق.

تحقق من Rx, رد الفعل ملحقات .صافي.ويشيرون إلى أنه مع IEnumerable أنت أساسا 'سحب' من تيار.استعلامات Linq على IQueryable/IEnumerable هي مجموعة العمليات التي 'فاشل' النتائج من مجموعة.ولكن مع نفس المشغلين على IObservable يمكنك كتابة استعلامات Linq أن 'الرد'.

على سبيل المثال ، يمكنك كتابة استعلام Linq مثل (من م في MyObservableSetOfMouseMovements حيث m.X<100 متر.Y<100 حدد النقطة(m.X,m.Y)).

و مع Rx امتداد هذا هو:لديك واجهة المستخدم التعليمات البرمجية التي يتفاعل واردة تيار من حركات الماوس و توجه كلما كنت في 100,100 مربع...

فرب هو مزيج من البرمجة الوظيفية(نموذج البرمجة مبنية على فكرة كل ما هو وظيفة) و رد الفعل نموذج البرمجة (مبنية على فكرة أن كل شيء هو تيار(المراقب و يمكن ملاحظتها الفلسفة)).فمن المفترض أن يكون أفضل من العالمين.

تحقق من اندريه Staltz بعد على رد الفعل البرمجة أن تبدأ مع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top