سؤال

أنا هاسكل مبتدئ ، وإن كان السابق اللثغة/مخطط التجربة.الآن أنا أبحث في أمثلة من SICP ومحاولة تنفيذها في هاسكل للحصول على مزيد من التدريب العملي على الخبرة.في محاضرة 3b الكتاب الحالي دالة لحساب المشتقات رمزيا.أنه يحتوي على جملة أمور منها ما يلي:

(define (deriv exp var)
    (cond ((constant? exp var) 0)
          ((same-var? exp var) 1)
; ...

كذلك في المحاضرة بعض المهام المحددة:

(define (constant? exp var)
    (and (atom? exp)
         (not (eq? exp var))))

هل هناك طريقة لفعل نفس الشيء في هاسكل ، أيالتحقق من atomicity و رمزية التكافؤ إلى بعض آخر وظيفة ؟ أو أكثر من عام ، ما هي الوسائل من "تفكيك" وظائف في هاسكل ؟

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

المحلول

والأمثلة مخطط لديك لا تفحص الواقع وظائف نظام. أنا فعلت مؤخرا بعض التمايز رمزي في هاسكل على القيم من النوع التالي:

data Exp a = Lit a
           | Exp a :*: Exp a
           | Exp a :+: Exp a
           | Var String
  deriving Eq

وبدلا من التمييز باستخدام atom? أو eq? استخدام case (أو غيرها من نمط مطابقة) و==.

نصائح أخرى

أولا, على الرغم من أن SICP رائع, أنصح ضدها من أجل التعلم هاسكل.(#) بعض الصعوبة في هذا السؤال ينبع من هذا.

في اللثغة/مخطط ، 'وظيفة' ويعتقد قطعة من التعليمات البرمجية ، ودراسة وظيفة يعني ببساطة فحص التعليمات البرمجية.في هاسكل ، 'وظيفة' يعني شيء أقرب الرياضية الوضوح ، خريطة من مجموعة إلى مجموعة B.لذلك على سبيل المثال ، فإنه من المنطقي في اللثغة السياق ، مقارنة وظيفتين:قارن فقط من التعليمات البرمجية الخاصة بهم.(ولكن (x+y)^2 و x^2+2*x*y+y^2 وظائف مختلفة?) في هاسكل, ذلك يعتمد على ما إذا كانت هناك بناء إجراءات تحديد المساواة بين فئة من الوظائف التي كنت تفكر.

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

derive :: Expression -> Expression

أن يفكك أحد Expression باستخدام نمط مطابقة التركيبات (أو أي شيء آخر اعتمادا على كيفية Expressions بنيت فوق).


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

وأنا لا أعتقد أنك تستطيع أن تفعل ذلك. ثغة هو homoiconic ، هاسكل ليست كذلك.

ولكن، مما غوغلينغ ظهر Liskell ، وهو (؟) هجين مثيرة للاهتمام.

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