البرمجة الوظيفية - الرموز القياسية والرسوم البيانية وما إلى ذلك

StackOverflow https://stackoverflow.com/questions/825675

سؤال

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

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

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

شكرا، مايك

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

المحلول

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

  1. إنها عديمة الجنسية إلى حد كبير، لذا فإن المخططات الحتمية التقليدية لا تهم.

  2. معظم الرموز الرياضية العادية والمتنوعة هي أيضًا عديمة الجنسية.

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

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

نصائح أخرى

يهتم المبرمجون الوظيفيون بكتابة المعادلات أكثر من كتابة الرسوم البيانية.اللعبة تسمى المنطق المعادل وينطوي في الغالب

  • استبدال متساوين بالمتساويين

  • تطبيق القوانين الجبرية

  • والدليل العرضي عن طريق الاستقراء

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

على سبيل المثال، إذا كنت أرغب في تبسيط تعبير المخطط

(append (list x) l)

سوف أقوم باستبدال يساوي بالمتساوي مثل الجنون.باستخدام تعريف list انا حصلت

(append (cons x '()) l)

استبدال نص الإلحاق لدي

(if (null? (cons x '())) 
    l
    (cons (car (cons x '())) (append (cdr (cons x '())) l)))

الآن لدي هذه القوانين الجبرية:

(null? (cons a b)) == #f
(car   (cons a b)) == a
(cdr   (cons a b)) == b

واستبدال يساوي يساوي أحصل عليه

(if #f
    l
    (cons x (append '() l))

وبقانون آخر (if #f e1 e2) == e2, ، انا حصلت

(cons x (append '() l))

وإذا قمت بتوسيع تعريف الإلحاق مرة أخرى سأحصل عليه

(cons x l)

الذي أثبت أنه يساوي

(append (list x) l)

لا أعرف الكثير عن البرمجة الوظيفية، ولكن هناك شيئان واجهتهما

  • غالبًا ما يتم استخدام λ (lambda) للدلالة على وظيفة
  • يتم استخدام f ο g للإشارة إلى تكوين الوظيفة
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top