سؤال

أنا أتعلم نمط البرمجة الوظيفية. في لا تخف من الملاحات, ، أعطى براين بيكمان مقدمة رائعة عن موناد. وذكر أن موناد يدور حول تكوين الوظائف لمعالجة التعقيد.

مناد يشمل unit الوظيفة التي تنقل نوع T إلى نوع مضخم M (T)؛ وظيفة الربط التي تعطى وظيفة من T إلى M (U)، يحول نوع M (T) إلى نوع آخر M (U). (يمكنك أن تكون ر، ولكن ليس بالضرورة).

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

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

المحلول

هناك الكثير من تطبيقات المنظمة في اللغات المكتوبة بشكل حيوي:

بشكل عام، فإن أطروحة تورينج الكنيسة تخبرنا أن كل ما يمكن القيام به في واحد يمكن أيضا القيام باللغة في كل شيء آخر لغة.

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

<?php
class Identity {
  protected $val;
  public function __construct($val) { $this->val = $val; }
  public static function m_return($a) { return new Identity($a); }
  public static function m_bind($id_a, $f) { return $f($id_a->val); }
}

var_dump(Identity::m_bind(
  Identity::m_return(1), function ($x) {
    return Identity::m_return($x+1);
  }
));
?>

لا توجد أنواع ثابتة، ولا عامة، لا إغلاق ضرورية.

الآن، إذا كنت ترغب في الواقع في الاختيار الشيكات، فأنت بحاجة إلى نظام نوع ثابت. ولكن هذا هو أكثر أو أقل تدوين: إذا كنت ترغب في التحقق من الأنواع القانونية، فأنت بحاجة إلى مدقق نوع ثابت. ده.

فيما يتعلق بسؤالك:

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

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

هناك أيضا رنجة حمراء هنا: إذا نظرت إلى مثال في تطبيقات موناد في C #، جافا أو ج، فهي أكثر تعقيدا بكثير وأكثر تعقيدا من، على سبيل المثال، كما يقول مثال PHP أعلاه. على وجه الخصوص، هناك طن من أنواع في كل مكان، لذلك بالتأكيد تبدو بديع. ولكن الحقيقة القبيحة هي: C #، أنظمة جافا ونوع جافا و C ليست قوية بما يكفي للتعبير عن نوع Monad. وبعد خاصه، Monad هو نوع متعدد الألوان المرتبة 2، ولكن C # و Java يدعم فقط مرتبة - 1 تعدد الأشكال (يسمونه "Generics"، لكنه نفس الشيء) و C لا يدعم ذلك حتى.

لذلك، هي في الواقع ليس يتم فحص نوع ثابت في C #، Java و C. (هذا هو السبب وراء تعريف اختصاصات LinQ Monad كأنما نمط وليس كأداة: لأنك ببساطة لا تستطيع يعبر النوع في C #.) كل نظام النوع الثابت، يجعل التنفيذ أكثر تعقيدا، دون المساعدة في الواقع. يتطلب نظام نوع أكثر تطورا بكثير مثل Haskell's، للحصول على سلامة من النوع الفعلي للمهن.

ملاحظة: ما كتبته أعلاه فقط ينطبق على عامة monad اكتب نفسها، كما يشير شروط. يمكنك بالتأكيد التعبير عن نوع أي محدد مناد، مثل List أو Maybe, ، لكن لا يمكنك التعبير عن نوع Monad بحد ذاتها. وهذا يعني أنه لا يمكنك كتابة التحقق من حقيقة أن "List هو Monad"، ولا يمكنك كتابة العمليات العامة التي تعمل على جميع مثيلات Monad.

(لاحظ أن التحقق من ذلك Monad يطيع أيضا مناد القوانين بالإضافة إلى المطابقة مع الماناد اكتب ربما الكثير حتى بالنسبة لنظام نوع Haskell. من المحتمل أنك تحتاج إلى أنواع معتمدة وربما حتى نظرية التلقائية التلقائية بالكامل.)

نصائح أخرى

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

تحتاج إلى إغلاق الدولة مناد. لقد بحثت عنها، PHP بإغلاق منذ 5.3. لذلك لن تكون مشكلة بعد الآن.

لا، في PHP لا يمكن تنفيذ الموصلات. تحتاج إلى إغلاق لذلك. أبدا أقل، فإن مفهوم ربما لا يزال لا يزال مفيدا، عندما تحاكي مطابقة نمط مع الفصول:

abstract class Maybe {
        abstract public function isJust();
        public function isNothing(){
                return !$this->isJust();
        }
}

class Just extends Maybe {
        protected $val = null;
        public function __construct($val){
                $this->val = $val;

        }
        public function isJust(){
                return true;
        }
        public function getVal(){
                return $this->val;
        }

}
class Nothing extends Maybe {
        protected $val = null;
        public function __construct(){

        }
        public function isJust(){
                return false;
        }
}

function just(){
        print "isJust";
}
function nothing(){
        print "nothing";
}
function MaybeFunc(Maybe $arg){
        if(get_class($arg) == 'Just'){
                print "Just";
        } else {
                print "Nothing";
        }
}

MaybeFunc(new Just(5));
MaybeFunc(new Nothing());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top