سؤال

أستطيع أن أفهم كيفية إنشاء وتفكير حساب التفاضل والتكامل في التزلج و BCKW ، لكنني لم أتمكن أبدًا من العثور على استخدامات عملية. ربما لا أبحث بعمق بما فيه الكفاية؟ وهذا هو ، أتساءل عما إذا (مثال فقط من فضلك ، أنا لا يعني أن هذا صحيح) تستخدم Java Servlets S على نطاق واسع وأن مولدات Python هي مثال على BCW وأنا غير قادر فقط على رؤيته من خلال غابة الأشجار؟

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

المحلول

في هاسكل ، هم في كل مكان!

  • ب هو <$>
  • ج هو flip
  • ك هو pure
  • أنا هو id
  • س هو <*>
  • ث هو join

من وجهة نظر هاسكل ، <$> يعني "القيام في السياق".

  • (+2) <$> (*3) يعني إضافة اثنين بعد مضاعفة ثلاثة.
  • (+2) <$> [1,2,3] يعني إضافة اثنين إلى كل عنصر في القائمة.
  • (+2) <$> (read . getLine) يعني إضافة اثنين إلى الرقم الذي قرأته للتو.
  • (+2) <$> someParser يعني إضافة اثنين إلى الرقم الذي قمت بتحليله للتو.

الأشياء التي لها سياق تسمى فونكتورات. كل ما لديك من java/python/c ++ هي مجرد إصدارات غريبة من الداخل خارج من functors.

اتصال آخر: S و K Combinator معًا هي Turing-Complete. في هاسكل ، pure و <*> معا يشكل functor التطبيقي.

بالطبع ، سيتطلب فهم كيفية ملاءمة المشابك الأخرى التعلم Haskell. لكن هذا المثال يوضح كيف يتم ترسيخ المدمجون في اللغة.

نصائح أخرى

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

نرى تطبيقاتها بلغات معينة (على سبيل المثال مرح و قطة). انا مرة نشرت على lambda-the-ultimate.org حول علاقة حساب التفاضل والتكامل SK بالقط والفرح.

لما قيمته: BCKW و SKI (أو SK) حساب متطابقان تقريبًا ، لكن أساس BCKW قد خرج من Vogue.

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

كل شيء عن السيطرة.

ربما تبدأ في مستوى أقل. النظام التطبيقي هو مجرد نظام يمكن تطبيق الكائنات على كائنات أخرى. مثال بسيط على النظام التطبيقي هو باش. LS | قد يفترض أحدهم أنهم في بعض البيئة ، وأن ما سبق يعني أنه على البيئة ، ثم بذل المزيد من الجهد. في الترميز التطبيقي ، يكون هذا أكثر @ (LS @ Environment) ومع ذلك ، يمكن للمرء أن يفعل أشياء أكثر تعقيدًا مثل LS | نمط GREP | أكثر من ذلك الآن في التدوينات التطبيقية ، هذا أكثر @ ((grep @ pattern) @ (ls @ evely)). لاحظ GREP @ نمط. يتم تطبيق GREP على نمط ، والذي يعيد البرنامج لمطابقة هذا النمط في نتيجة LS. هذه هي نقطة التطبيق ، لتطبيق برنامج على الحجج ، وبناء برامج جديدة من برامج "Atomic" (AKA Buildin). ومع ذلك ، لا يمكننا القيام بالكثير من البرمجة مع التطبيق البدائي أو المدمج. نحتاج إلى وسيلة لتنظيم مدخلاتنا وتطبيق بداياتنا على مدخلاتنا.

هذا هو المكان الذي يأتي فيه Lambda. باستخدام Lambda ، يمكن للمرء تعميم (Grep @ Pattern) على تطبيق GREP على أي مدخلات ، (GREP @ X) ومع ذلك ، يجب أن يكون لدينا طريقة للحصول على المدخلات إلى GREP. وبالتالي نستخدم عادة الوظائف. F (x) = grep @ x تسمى العملية أعلاه استخلاص الوسيطة. ولكن لا يوجد سبب للتفكير في الاسم F على أنه مميز ، لذلك لدينا بناء جملة له: Lambda X. GREP @ X ثم Lambda X. GREP @ X ، يمكن تطبيقه على إدخال ، وسيتم استبدال الإدخال في الجسم وتقييمه. ومع ذلك ، يمكن أن يكون الاستبدال متغيرات فوضوية ، يمكن أن تكون مزعجة لتنفيذها على الجهاز. يمنح Ski (أو B ، C ، K ، W) طريقة للقيام بأشياء Lambda دون استبدال ، وبدلاً من ذلك مجرد تبديل الطلبات.

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

ينبغي للمرء أن يلاحظ أن تخفيض التزلج كسول بطبيعته ، لذلك قد يلزم إجراء بعض الاعتبار في استخدام العالم الحقيقي للتزلج على التطبيق. في الواقع ، ربما تم الآن تقييم الحجج بالكامل ، وقد تكون تطبيقًا جزئيًا أيضًا. يمكن للمرء أن يتجول هذا بنظرية النوع ، وتقييم برنامج فقط على مدخلاته إذا كان البرنامج في موضع التطبيق. أي ، إذا كتب المرء مع شروط Lambda مغلقة ، تُرجم إلى Ski ، ثم إذا كان p @ arg1 @ .... يجب أن يكون الأمر أنه إذا كان p هو برنامج بدائي ، فإن إعادة كتابة قد اكتملت ، وبالتالي فإن كل الحجج هي 1 ) المتاحة ، 2) تقييمها بالكامل. ومع ذلك ، لم أثبت هذا ، وقد لا يكون هذا صحيحًا بنظرية قوية بما يكفي ...

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