البرمجة الوظيفية
في علوم الكمبيوتر ، البرمجة الوظيفية هي نموذج برمجة يتم فيه إنشاء البرامج من خلال تطبيق وتكوين وظائف . إنه نموذج برمجة إعلاني حيث تكون تعريفات الوظائف عبارة عن أشجار من التعبيرات التي تربط القيم بقيم أخرى، بدلاً من سلسلة من العبارات الإلزامية التي تقوم بتحديث حالة تشغيل البرنامج.
في البرمجة الوظيفية، يتم التعامل مع الوظائف كمواطنين من الدرجة الأولى ، مما يعني أنه يمكن ربطها بأسماء (بما في ذلك المعرفات المحلية )، وتمريرها كحجج ، وإرجاعها من وظائف أخرى، تمامًا كما يمكن لأي نوع بيانات آخر . يسمح هذا بكتابة البرامج بأسلوب إعلاني وقابل للتكوين ، حيث يتم دمج الوظائف الصغيرة بطريقة معيارية .
تُعامل البرمجة الوظيفية أحيانًا على أنها مرادفة للبرمجة الوظيفية البحتة ، وهي مجموعة فرعية من البرمجة الوظيفية التي تعامل جميع الدوال كدوال رياضية حتمية ، أو دوال نقية . عندما يتم استدعاء دالة نقية ببعض الوسائط المعطاة، فإنها ستعيد دائمًا نفس النتيجة، ولا يمكن أن تتأثر بأي حالة قابلة للتغيير أو أي آثار جانبية أخرى . وهذا على النقيض من الإجراءات غير النقية ، الشائعة في البرمجة الإلزامية ، والتي يمكن أن يكون لها آثار جانبية (مثل تعديل حالة البرنامج أو أخذ مدخلات من المستخدم). يزعم أنصار البرمجة الوظيفية البحتة أنه من خلال تقييد الآثار الجانبية، يمكن أن تحتوي البرامج على عدد أقل من الأخطاء ، وأن تكون أسهل في التصحيح والاختبار ، وأن تكون أكثر ملاءمة للتحقق الرسمي . [1] [2]
تعود جذور البرمجة الوظيفية إلى الأوساط الأكاديمية ، حيث تطورت من حساب لامدا ، وهو نظام رسمي للحساب يعتمد فقط على الوظائف. كانت البرمجة الوظيفية تاريخيًا أقل شعبية من البرمجة الإلزامية، ولكن العديد من اللغات الوظيفية تشهد الاستخدام اليوم في الصناعة والتعليم، بما في ذلك Common Lisp و Scheme و [3] [4] [5] [6] Clojure و Wolfram Language و [7] [8] Racket و [9] Erlang و [10] [11] [12] Elixir و [13] OCaml و [14] [15] Haskell و [16] [17] و F# . [18] [19] Lean هي لغة برمجة وظيفية تُستخدم عادةً للتحقق من صحة النظريات الرياضية. [20] البرمجة الوظيفية هي أيضًا مفتاح لبعض اللغات التي وجدت نجاحًا في مجالات محددة، مثل JavaScript في الويب، [21] R في الإحصاء، [22] [23] J و K و Q في التحليل المالي، و XQuery / XSLT لـ XML . [24] [25] تستخدم اللغات الإعلانية الخاصة بالمجال مثل SQL و Lex / Yacc بعض عناصر البرمجة الوظيفية، مثل عدم السماح بالقيم القابلة للتغيير . [26] بالإضافة إلى ذلك، تدعم العديد من لغات البرمجة الأخرى البرمجة بأسلوب وظيفي أو نفذت ميزات من البرمجة الوظيفية، مثل C++11 و C# و [27] Kotlin و [28] Perl و [29] PHP و [30] Python و [31] Go و [32] Rust و [33] Raku و [34] Scala و [35] و Java (منذ Java 8) . [36]
تاريخ
حساب لامدا ، الذي طوره ألونسو تشيرش في ثلاثينيات القرن العشرين ، هو نظام رسمي للحساب مبني على تطبيق الوظيفة . في عام 1937 أثبت آلان تورينج أن حساب لامدا وآلات تورينج هي نماذج مكافئة للحساب، [ 37] مما يدل على أن حساب لامدا مكتمل وفقًا لتورينج . يشكل حساب لامدا الأساس لجميع لغات البرمجة الوظيفية. تم تطوير صياغة نظرية مكافئة، المنطق التوليفي ، بواسطة موسى شونفينكل وهاسكل كاري في عشرينيات وثلاثينيات القرن العشرين. [38]
طور تشرش لاحقًا نظامًا أضعف، وهو حساب لامدا البسيط ، والذي وسع حساب لامدا من خلال تعيين نوع بيانات لجميع المصطلحات. [39] يشكل هذا الأساس للبرمجة الوظيفية ذات النوع الثابت.
تم تطوير أول لغة برمجة وظيفية عالية المستوى ، ليسب ، في أواخر الخمسينيات من القرن العشرين لسلسلة أجهزة الكمبيوتر العلمية IBM 700/7000 بواسطة جون مكارثي أثناء وجوده في معهد ماساتشوستس للتكنولوجيا (MIT). [40] تم تعريف وظائف ليسب باستخدام تدوين لامدا تشرش، وتم توسيعه باستخدام بنية تسمية للسماح بالوظائف المتكررة . [41] قدمت ليسب لأول مرة العديد من الميزات النموذجية للبرمجة الوظيفية، على الرغم من أن ليسب المبكرة كانت لغات متعددة النماذج ، وتضمنت دعمًا للعديد من أنماط البرمجة مع تطور النماذج الجديدة. سعت اللهجات اللاحقة، مثل Scheme و Clojure ، وفروع مثل Dylan و Julia ، إلى تبسيط ليسب وعقلنتها حول جوهر وظيفي نظيف، بينما تم تصميم Common Lisp للحفاظ على وتحديث الميزات النموذجية للعديد من اللهجات القديمة التي حلت محلها. [42]
يُستشهد أحيانًا بلغة معالجة المعلومات (IPL)، التي ظهرت عام 1956، باعتبارها أول لغة برمجة وظيفية تعتمد على الكمبيوتر. [43] وهي لغة بأسلوب التجميع لمعالجة قوائم الرموز. ولديها مفهوم المولد ، الذي يعادل دالة تقبل دالة كحجة، ولأنها لغة على مستوى التجميع، يمكن أن يكون الكود عبارة عن بيانات، لذلك يمكن اعتبار IPL ذات وظائف من الدرجة الأعلى. ومع ذلك، فهي تعتمد بشكل كبير على بنية القائمة المتحولة وميزات الأمر المماثلة.
طور كينيث إي. إيفرسون لغة APL في أوائل الستينيات، ووصفها في كتابه عام 1962 لغة برمجة ( ISBN 9780471430148 ). كانت لغة APL هي التأثير الأساسي على FP لجون باكوس . في أوائل التسعينيات، أنشأ إيفرسون وروجر هوي لغة J. في منتصف التسعينيات، أنشأ آرثر ويتني ، الذي عمل سابقًا مع إيفرسون، لغة K ، والتي تُستخدم تجاريًا في الصناعات المالية جنبًا إلى جنب مع سليلها Q.
في منتصف الستينيات، اخترع بيتر لاندين آلة SECD ، [44] وهي أول آلة مجردة للغة برمجة وظيفية، [45] ووصف المراسلات بين ALGOL 60 وحساب لامدا ، [46] [47] واقترح لغة برمجة ISWIM . [48]
قدم جون باكوس البرمجة الوظيفية في محاضرته التي ألقاها في حفل جائزة تورينج عام 1977 بعنوان "هل يمكن تحرير البرمجة من أسلوب فون نيومان ؟ الأسلوب الوظيفي وجبر البرامج". [49] وهو يعرّف البرامج الوظيفية بأنها مبنية بطريقة هرمية عن طريق "أشكال الجمع" التي تسمح بـ "جبر البرامج"؛ وفي اللغة الحديثة، يعني هذا أن البرامج الوظيفية تتبع مبدأ التكوين . [ بحاجة لمصدر ] عملت ورقة باكوس على تعميم البحث في البرمجة الوظيفية، على الرغم من أنها أكدت على برمجة مستوى الوظيفة بدلاً من أسلوب حساب لامدا المرتبط الآن بالبرمجة الوظيفية.
تم إنشاء لغة ML عام 1973 بواسطة روبن ميلنر في جامعة إدنبرة ، وطور ديفيد تورنر لغة SASL في جامعة سانت أندروز . كما طور بورستال ودارلينجتون في إدنبرة في السبعينيات اللغة الوظيفية NPL . [50] استندت NPL إلى معادلات كليين التكرارية وتم تقديمها لأول مرة في عملهم على تحويل البرامج. [51] ثم قام بورستال وماكوين وسانيلا بدمج فحص النوع متعدد الأشكال من ML لإنتاج لغة Hope . [52] تطورت ML في النهاية إلى عدة لهجات، وأكثرها شيوعًا الآن هي OCaml و Standard ML .
في سبعينيات القرن العشرين، طور جاي إل ستيل وجيرالد جاي سوسمان لغة Scheme ، كما هو موضح في أوراق لامدا والكتاب المدرسي لعام 1985 بعنوان هيكل وتفسير برامج الكمبيوتر . كانت لغة Scheme أول لهجة من لغة ليسب تستخدم النطاق المعجمي وتتطلب تحسين استدعاء الذيل ، وهي ميزات تشجع البرمجة الوظيفية.
في ثمانينيات القرن العشرين، طور بير مارتن لوف نظرية النوع الحدسي (وتسمى أيضًا نظرية النوع البنّاء )، والتي ربطت البرامج الوظيفية بالإثباتات البنّاءة المعبر عنها كأنواع تابعة . وقد أدى هذا إلى مناهج جديدة لإثبات النظريات التفاعلية وأثر على تطوير لغات البرمجة الوظيفية اللاحقة. [ بحاجة لمصدر ]
ظهرت لغة ميراندا الوظيفية الكسولة ، التي طورها ديفيد تورنر، في عام 1985 وكان لها تأثير قوي على هاسكل . نظرًا لأن ميراندا كانت مملوكة، فقد بدأت هاسكل بإجماع في عام 1987 لتشكيل معيار مفتوح لأبحاث البرمجة الوظيفية؛ وكانت إصدارات التنفيذ مستمرة اعتبارًا من عام 1990.
في الآونة الأخيرة، تم استخدامه في مجالات مثل CAD البارامترية في لغة OpenSCAD المبنية على إطار عمل CGAL ، على الرغم من أن تقييده على إعادة تعيين القيم (يتم التعامل مع جميع القيم كثوابت) أدى إلى ارتباك بين المستخدمين غير المألوفين بالبرمجة الوظيفية كمفهوم. [53]
لا يزال استخدام البرمجة الوظيفية مستمرًا في الإعدادات التجارية. [54] [55] [56]
المفاهيم
هناك عدد من المفاهيم [57] والنماذج الخاصة بالبرمجة الوظيفية، وهي غريبة بشكل عام على البرمجة الآمرة (بما في ذلك البرمجة الموجهة للكائنات ). ومع ذلك، غالبًا ما تلبي لغات البرمجة العديد من نماذج البرمجة، لذلك ربما استخدم المبرمجون الذين يستخدمون لغات "آمرة في الغالب" بعض هذه المفاهيم. [58]
الوظائف من الدرجة الأولى والأعلى
الدوال ذات الترتيب الأعلى هي الدوال التي يمكنها إما أن تأخذ دوال أخرى كحجج أو تعيدها كنتائج. في حساب التفاضل والتكامل، يعد عامل التفاضل مثالاً على الدالة ذات الترتيب الأعلى ، والذي يعيد المشتقة للدالة .
ترتبط الدوال ذات الترتيب الأعلى ارتباطًا وثيقًا بالدوال من الدرجة الأولى من حيث أن الدوال ذات الترتيب الأعلى والدوال من الدرجة الأولى تسمحان للدوال بالظهور كحجج ونتائج لدوال أخرى. والتمييز بين الاثنين دقيق: "الترتيب الأعلى" يصف مفهومًا رياضيًا للدوال التي تعمل على دوال أخرى، بينما "الدرجة الأولى" هو مصطلح في علوم الكمبيوتر للكيانات في لغة البرمجة التي لا توجد قيود على استخدامها (وبالتالي يمكن أن تظهر الدوال من الدرجة الأولى في أي مكان في البرنامج يمكن للكيانات الأخرى من الدرجة الأولى مثل الأرقام أن تظهر فيه، بما في ذلك كحجج لدوال أخرى وكقيم إرجاع لها).
تتيح الدوال ذات الترتيب الأعلى إمكانية التطبيق الجزئي أو التكرير ، وهي تقنية تطبق الدالة على وسيطاتها واحدة تلو الأخرى، مع إرجاع كل تطبيق لدالة جديدة تقبل الوسيطة التالية. يتيح هذا للمبرمج التعبير بشكل موجز، على سبيل المثال، عن الدالة اللاحقة كعامل جمع مطبق جزئيًا على العدد الطبيعي واحد.
وظائف نقية
لا توجد آثار جانبية للوظائف (أو التعبيرات) النقية (الذاكرة أو الإدخال/الإخراج). وهذا يعني أن الوظائف النقية لها العديد من الخصائص المفيدة، والتي يمكن استخدام العديد منها لتحسين الكود:
- إذا لم يتم استخدام نتيجة تعبير نقي، فيمكن إزالته دون التأثير على التعبيرات الأخرى.
- إذا تم استدعاء دالة نقية باستخدام وسيطات لا تسبب أي آثار جانبية، فإن النتيجة تكون ثابتة بالنسبة لقائمة الوسيطات تلك (يُطلق عليها أحيانًا الشفافية المرجعية أو القدرة على التكرار )، أي أن استدعاء الدالة النقية مرة أخرى باستخدام نفس الوسيطات يُرجع نفس النتيجة. (يمكن أن يؤدي هذا إلى تمكين تحسينات التخزين المؤقت مثل التذكير .)
- إذا لم يكن هناك اعتماد على البيانات بين تعبيرين نقيين، فيمكن عكس ترتيبهما، أو يمكن إجراؤهما بالتوازي ولا يمكنهما التداخل مع بعضهما البعض (بعبارة أخرى، يكون تقييم أي تعبير نقي آمنًا للخيط ).
- إذا كانت اللغة بأكملها لا تسمح بالآثار الجانبية، فيمكن استخدام أي استراتيجية تقييم؛ وهذا يمنح المترجم حرية إعادة ترتيب أو دمج تقييم التعبيرات في البرنامج (على سبيل المثال، استخدام إزالة الغابات ).
في حين أن معظم المترجمين للغات البرمجة الآمرة يكتشفون الوظائف النقية ويقومون بإزالة التعبيرات الفرعية المشتركة لمكالمات الوظائف النقية، إلا أنهم لا يستطيعون دائمًا القيام بذلك للمكتبات المترجمة مسبقًا، والتي لا تكشف هذه المعلومات بشكل عام، وبالتالي تمنع التحسينات التي تنطوي على تلك الوظائف الخارجية. تضيف بعض المترجمين، مثل gcc ، كلمات رئيسية إضافية للمبرمج لتمييز الوظائف الخارجية صراحةً على أنها نقية، لتمكين مثل هذه التحسينات. يسمح Fortran 95 أيضًا بتعيين الوظائف على أنها نقية . [59] أضافت C++11 constexprكلمة رئيسية ذات دلالات مماثلة.
التكرار
عادة ما يتم إنجاز التكرار (الحلقة) في اللغات الوظيفية من خلال التكرار . تستدعي الدوال التكرارية نفسها، مما يسمح بتكرار العملية حتى تصل إلى الحالة الأساسية . بشكل عام، يتطلب التكرار الحفاظ على مكدس ، والذي يستهلك مساحة بمقدار خطي لعمق التكرار. قد يجعل هذا التكرار مكلفًا للغاية للاستخدام بدلاً من الحلقات الإلزامية. ومع ذلك، يمكن التعرف على شكل خاص من التكرار المعروف باسم التكرار الذيلي وتحسينه بواسطة المترجم في نفس الكود المستخدم لتنفيذ التكرار في اللغات الإلزامية. يمكن تنفيذ تحسين التكرار الذيلي عن طريق تحويل البرنامج إلى نمط تمرير الاستمرار أثناء التجميع، من بين طرق أخرى.
تتطلب معايير لغة Scheme أن تدعم التنفيذات التكرار الذيلي المناسب، مما يعني أنه يجب السماح بعدد غير محدود من مكالمات الذيل النشطة. [60] [ 61] التكرار الذيلي المناسب ليس مجرد تحسين؛ إنه ميزة لغوية تضمن للمستخدمين أنه يمكنهم استخدام التكرار للتعبير عن حلقة وأن القيام بذلك سيكون آمنًا للمساحة. [62] علاوة على ذلك، على عكس اسمه، فإنه يأخذ في الاعتبار جميع مكالمات الذيل، وليس فقط التكرار الذيلي. في حين يتم تنفيذ التكرار الذيلي المناسب عادةً عن طريق تحويل الكود إلى حلقات إلزامية، فقد تنفذه التنفيذات بطرق أخرى. على سبيل المثال، تحافظ Chicken عمدًا على مكدس وتسمح للمكدس بالفيضان . ومع ذلك، عندما يحدث هذا، فإن جامع القمامة الخاص به سيطالب بالمساحة مرة أخرى، [63] مما يسمح بعدد غير محدود من مكالمات الذيل النشطة على الرغم من أنه لا يحول التكرار الذيلي إلى حلقة.
يمكن تجريد الأنماط الشائعة للتكرار باستخدام وظائف من الدرجة الأعلى، حيث تعد التشوهات والتشوهات ( أو "الطيات" و"الفتحات") من الأمثلة الأكثر وضوحًا. تلعب مخططات التكرار هذه دورًا مشابهًا لهياكل التحكم المضمنة مثل الحلقات في اللغات الآمرة .
تسمح معظم لغات البرمجة الوظيفية للأغراض العامة بالتكرار غير المقيد وهي كاملة تورينج ، مما يجعل مشكلة التوقف غير قابلة للحل ، ويمكن أن تتسبب في عدم سلامة التفكير المعادلات ، وتتطلب عمومًا إدخال التناقض في المنطق المعبر عنه بواسطة نظام نوع اللغة . تسمح بعض اللغات ذات الأغراض الخاصة مثل Coq بالتكرار المؤسس جيدًا فقط وهي تطبيعية بقوة (لا يمكن التعبير عن الحسابات غير المنتهية إلا بتدفقات لا نهائية من القيم تسمى codata ). ونتيجة لذلك، تفشل هذه اللغات في أن تكون كاملة تورينج والتعبير عن وظائف معينة فيها أمر مستحيل، لكنها لا تزال قادرة على التعبير عن فئة واسعة من الحسابات المثيرة للاهتمام مع تجنب المشاكل التي يسببها التكرار غير المقيد. تسمى البرمجة الوظيفية المحدودة بالتكرار المؤسس جيدًا مع بعض القيود الأخرى بالبرمجة الوظيفية الكلية . [64]
التقييم الصارم مقابل التقييم غير الصارم
يمكن تصنيف اللغات الوظيفية حسب ما إذا كانت تستخدم التقييم الصارم (الحريص) أو غير الصارم (الكسول) ، وهي المفاهيم التي تشير إلى كيفية معالجة وسيطات الوظيفة عند تقييم تعبير. يكمن الاختلاف الفني في الدلالات الدلالية للتعبيرات التي تحتوي على حسابات فاشلة أو متباعدة. في ظل التقييم الصارم، يفشل تقييم أي مصطلح يحتوي على مصطلح فرعي فاشل. على سبيل المثال، التعبير:
طول الطباعة ([2+1، 3*2، 1/0، 5-4])
تفشل في التقييم الصارم بسبب القسمة على صفر في العنصر الثالث من القائمة. في التقييم الكسول، تعيد دالة الطول القيمة 4 (أي عدد العناصر في القائمة)، حيث إن تقييمها لا يحاول تقييم المصطلحات التي تشكل القائمة. باختصار، يقوم التقييم الصارم دائمًا بتقييم وسيطات الدالة بالكامل قبل استدعاء الدالة. لا يقوم التقييم الكسول بتقييم وسيطات الدالة ما لم تكن قيمها مطلوبة لتقييم استدعاء الدالة نفسها.
استراتيجية التنفيذ المعتادة للتقييم الكسول في اللغات الوظيفية هي تقليل الرسم البياني . [65] يتم استخدام التقييم الكسول بشكل افتراضي في العديد من اللغات الوظيفية البحتة، بما في ذلك Miranda و Clean و Haskell .
يزعم هيوز 1984 أن التقييم الكسول هو آلية لتحسين وحدات البرنامج من خلال فصل الاهتمامات ، وذلك بتسهيل التنفيذ المستقل للمنتجين والمستهلكين لتدفقات البيانات. [2] يصف لانشبيري 1993 بعض الصعوبات التي يفرضها التقييم الكسول، وخاصة في تحليل متطلبات تخزين البرنامج، ويقترح دلالات تشغيلية للمساعدة في مثل هذا التحليل. [66] يقترح هاربر 2009 تضمين التقييم الصارم والكسول في نفس اللغة، باستخدام نظام نوع اللغة للتمييز بينهما. [67]
أنظمة النوع
منذ تطوير استدلال نوع هيندلي-ميلنر في سبعينيات القرن العشرين، كانت لغات البرمجة الوظيفية تميل إلى استخدام حساب لامدا المكتوب ، ورفض جميع البرامج غير الصالحة في وقت التجميع والمجازفة بأخطاء إيجابية كاذبة ، على عكس حساب لامدا غير المكتوب ، الذي يقبل جميع البرامج الصالحة في وقت التجميع ويجازف بأخطاء سلبية كاذبة ، المستخدم في ليسب ومتغيراتها (مثل Scheme )، حيث يرفضون جميع البرامج غير الصالحة في وقت التشغيل عندما تكون المعلومات كافية لعدم رفض البرامج الصالحة. يجعل استخدام أنواع البيانات الجبرية التلاعب بهياكل البيانات المعقدة ملائمًا؛ إن وجود فحص نوع قوي في وقت التجميع يجعل البرامج أكثر موثوقية في غياب تقنيات الموثوقية الأخرى مثل التطوير القائم على الاختبار ، بينما يحرر استدلال النوع المبرمج من الحاجة إلى إعلان الأنواع يدويًا للمترجم في معظم الحالات.
تعتمد بعض اللغات الوظيفية الموجهة نحو البحث مثل Coq و Agda و Cayenne و Epigram على نظرية النوع الحدسية ، والتي تسمح للأنواع بالاعتماد على المصطلحات. تسمى هذه الأنواع بالأنواع التابعة . لا تحتوي أنظمة الأنواع هذه على استدلال نوعي يمكن تحديده ويصعب فهمها وبرمجتها بها. [68] [69] [70] [71] لكن الأنواع التابعة يمكنها التعبير عن مقترحات تعسفية في منطق من الدرجة الأعلى . من خلال تماثل كاري-هاورد ، تصبح البرامج ذات النوع الجيد في هذه اللغات وسيلة لكتابة أدلة رياضية رسمية يمكن للمترجم من خلالها إنشاء كود معتمد . في حين أن هذه اللغات ذات أهمية أساسية في البحث الأكاديمي (بما في ذلك الرياضيات الرسمية )، فقد بدأ استخدامها في الهندسة أيضًا. Compcert هو مترجم لمجموعة فرعية من لغة C مكتوبة في Coq وتم التحقق منها رسميًا. [72]
يمكن تنفيذ شكل محدود من الأنواع التابعة التي تسمى أنواع البيانات الجبرية المعممة (GADT's) بطريقة توفر بعض فوائد البرمجة ذات النوع التابع مع تجنب معظم مضايقاتها. [73] تتوفر أنواع البيانات الجبرية المعممة في Glasgow Haskell Compiler ، وفي OCaml [74] وفي Scala ، [75] وتم اقتراحها كإضافات إلى لغات أخرى بما في ذلك Java وC#. [76]
الشفافية المرجعية
لا تحتوي البرامج الوظيفية على عبارات تعيين، أي أن قيمة المتغير في البرنامج الوظيفي لا تتغير أبدًا بمجرد تعريفه. وهذا يلغي أي احتمالات للآثار الجانبية لأن أي متغير يمكن استبداله بقيمته الفعلية في أي نقطة من التنفيذ. لذا، فإن البرامج الوظيفية شفافة مرجعيًا. [77]
فكر في عبارة التعيين في لغة Cx=x*10 ، وهذا يغير القيمة المعينة للمتغير x. لنفترض أن القيمة الأولية لـ xwas 1، فإن تقييمين متتاليين للمتغير xينتجان 10و 100على التوالي. من الواضح أن الاستبدال x=x*10بـ 10أو 100يعطي البرنامج معنى مختلفًا، وبالتالي فإن التعبير ليس شفافًا مرجعيًا. في الواقع، لا تكون عبارات التعيين شفافة مرجعيًا أبدًا.
الآن، ضع في اعتبارك دالة أخرى مثل is transparent، حيث إنها لا تغير ضمنيًا المدخل x وبالتالي لا توجد لها مثل هذه الآثار الجانبية . تستخدم البرامج الوظيفية هذا النوع من الوظائف حصريًا وبالتالي فهي شفافة مرجعيًا.
int plusone(int x) {return x+1;}
هياكل البيانات
غالبًا ما يتم تمثيل هياكل البيانات الوظيفية البحتة بطريقة مختلفة عن نظيراتها الإلزامية . [78] على سبيل المثال، تعد المصفوفة ذات أوقات الوصول والتحديث الثابتة مكونًا أساسيًا لمعظم اللغات الإلزامية، وتستند العديد من هياكل البيانات الإلزامية، مثل جدول التجزئة والكومة الثنائية ، إلى المصفوفات. يمكن استبدال المصفوفات بخرائط أو قوائم وصول عشوائية، والتي تسمح بالتنفيذ الوظيفي البحت، ولكن لها أوقات وصول وتحديث لوغاريتمية . تتمتع هياكل البيانات الوظيفية البحتة بالثبات ، وهي خاصية الاحتفاظ بالإصدارات السابقة من هيكل البيانات دون تعديل. في Clojure، تُستخدم هياكل البيانات الدائمة كبدائل وظيفية لنظيراتها الإلزامية. على سبيل المثال، تستخدم المتجهات الدائمة الأشجار للتحديث الجزئي. سيؤدي استدعاء طريقة الإدراج إلى إنشاء بعض العقد ولكن ليس كلها. [79]
مقارنة بالبرمجة الآمرة
تختلف البرمجة الوظيفية اختلافًا كبيرًا عن البرمجة الإلزامية . تنبع الاختلافات الأكثر أهمية من حقيقة أن البرمجة الوظيفية تتجنب الآثار الجانبية ، والتي تُستخدم في البرمجة الإلزامية لتنفيذ الحالة والإدخال/الإخراج. تمنع البرمجة الوظيفية البحتة الآثار الجانبية تمامًا وتوفر شفافية مرجعية.
نادرًا ما تُستخدم الدوال ذات الترتيب الأعلى في البرمجة الإلزامية القديمة. قد يستخدم برنامج الإلزامية التقليدي حلقة لاجتياز قائمة وتعديلها. من ناحية أخرى، قد يستخدم برنامج وظيفي دالة "خريطة" ذات ترتيب أعلى تأخذ دالة وقائمة، وتولد قائمة جديدة وتعيدها من خلال تطبيق الدالة على كل عنصر في القائمة.
البرمجة الإلزامية مقابل البرمجة الوظيفية
يحقق المثالان التاليان (المكتوبان بلغة JavaScript ) نفس التأثير: حيث يقومان بضرب جميع الأرقام الزوجية في مصفوفة بـ 10 ثم جمعها جميعًا، وتخزين المجموع النهائي في المتغير "result".
حلقة الأمر التقليدية:
const numList = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ; دع النتيجة = 0 ; لـ ( دع i = 0 ; i < numList.length ; i ++ ) { إذا ( numList [ i ] % 2 === 0 ) { النتيجة + = numList [ i ] * 10 ; } }
البرمجة الوظيفية باستخدام وظائف من الدرجة الأعلى:
النتيجة الثابتة = [ 1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8 ، 9 ، 10 ] . التصفية ( n => n % 2 === 0 ) . الخريطة ( a => a * 10 ) . التخفيض (( a ، b ) => a + b ، 0 )؛
في بعض الأحيان قد تؤدي التجريدات التي تقدمها البرمجة الوظيفية إلى تطوير كود أكثر قوة يتجنب بعض المشكلات التي قد تنشأ عند البناء على كمية كبيرة من الكود المعقد والإلزامي، مثل أخطاء الانحراف عن واحد (انظر القاعدة العاشرة لجرينسبون ).
محاكاة الحالة
توجد مهام (على سبيل المثال، الحفاظ على رصيد حساب مصرفي) تبدو غالبًا وكأنها تُنفَّذ بشكل طبيعي باستخدام الحالة. تُنفِّذ البرمجة الوظيفية البحتة هذه المهام، ومهام الإدخال/الإخراج مثل قبول إدخال المستخدم والطباعة على الشاشة، بطريقة مختلفة.
تنفذ لغة البرمجة الوظيفية البحتة Haskell هذه المفاهيم باستخدام وحدات الموناد ، المستمدة من نظرية الفئات . [80] توفر وحدات الموناد طريقة لتلخيص أنواع معينة من الأنماط الحسابية، بما في ذلك (ولكن ليس على سبيل الحصر) نمذجة العمليات الحسابية باستخدام الحالة القابلة للتغيير (والآثار الجانبية الأخرى مثل الإدخال/الإخراج) بطريقة إلزامية دون فقدان النقاء. في حين قد يكون من السهل تطبيق وحدات الموناد الموجودة في برنامج، مع مراعاة القوالب والأمثلة المناسبة، يجد العديد من الطلاب صعوبة في فهمها مفاهيميًا، على سبيل المثال، عندما يُطلب منهم تعريف وحدات موناد جديدة (وهو أمر مطلوب أحيانًا لأنواع معينة من المكتبات). [81]
تحاكي اللغات الوظيفية أيضًا الحالات من خلال تمرير الحالات الثابتة. ويمكن القيام بذلك عن طريق جعل الدالة تقبل الحالة كواحدة من معلماتها، ثم تعيد حالة جديدة مع النتيجة، مع ترك الحالة القديمة دون تغيير. [82]
تتضمن اللغات الوظيفية غير النقية عادةً طريقة أكثر مباشرة لإدارة الحالة القابلة للتغيير. على سبيل المثال، تستخدم لغة Clojure مراجع مُدارة يمكن تحديثها من خلال تطبيق وظائف نقية على الحالة الحالية. يتيح هذا النوع من النهج إمكانية التغيير مع الاستمرار في تعزيز استخدام الوظائف النقية باعتبارها الطريقة المفضلة للتعبير عن العمليات الحسابية. [ بحاجة لمصدر ]
تم تطوير طرق بديلة مثل منطق هوار والتفرد لتتبع الآثار الجانبية في البرامج. تستخدم بعض لغات البحث الحديثة أنظمة التأثير لتوضيح وجود الآثار الجانبية. [ بحاجة لمصدر ]
قضايا الكفاءة
لغات البرمجة الوظيفية أقل كفاءة عادةً في استخدام وحدة المعالجة المركزية والذاكرة من اللغات الآمرة مثل C و Pascal . [83] وهذا مرتبط بحقيقة أن بعض هياكل البيانات القابلة للتغيير مثل المصفوفات لها تنفيذ مباشر للغاية باستخدام الأجهزة الحالية. يمكن الوصول إلى المصفوفات المسطحة بكفاءة عالية باستخدام وحدات المعالجة المركزية ذات الأنابيب العميقة، أو جلبها مسبقًا بكفاءة من خلال ذاكرة التخزين المؤقت (بدون مطاردة مؤشر معقدة)، أو التعامل معها باستخدام تعليمات SIMD. كما أنه ليس من السهل إنشاء نظيراتها غير القابلة للتغيير ذات الكفاءة العامة. بالنسبة للغات الوظيفية البحتة، يكون أسوأ تباطؤ في الحالة لوغاريتميًا في عدد خلايا الذاكرة المستخدمة، لأنه يمكن تمثيل الذاكرة القابلة للتغيير بواسطة بنية بيانات وظيفية بحتة بوقت وصول لوغاريتمي (مثل شجرة متوازنة). [84] ومع ذلك، فإن مثل هذه التباطؤات ليست عالمية. بالنسبة للبرامج التي تقوم بعمليات حسابية رقمية مكثفة، فإن اللغات الوظيفية مثل OCaml و Clean أبطأ قليلاً من C وفقًا للعبة معايير لغة الكمبيوتر . [85] بالنسبة للبرامج التي تتعامل مع مصفوفات كبيرة وقواعد بيانات متعددة الأبعاد ، تم تصميم لغات وظيفية للمصفوفات (مثل J و K ) مع تحسينات السرعة.
يمكن أن يؤدي ثبات البيانات في كثير من الحالات إلى كفاءة التنفيذ من خلال السماح للمترجم بإجراء افتراضات غير آمنة في لغة أمرية، وبالتالي زيادة فرص التوسع المضمن . [86] حتى لو كانت عملية النسخ المعنية التي قد تبدو ضمنية عند التعامل مع هياكل بيانات ثابتة غير قابلة للتغيير قد تبدو مكلفة حسابيًا، فإن بعض لغات البرمجة الوظيفية، مثل Clojure، تحل هذه المشكلة من خلال تنفيذ آليات لمشاركة الذاكرة الآمنة بين البيانات غير القابلة للتغيير رسميًا . [87] تتميز Rust بنهجها تجاه ثبات البيانات والذي يتضمن مراجع غير قابلة للتغيير [88] ومفهوم يسمى أعمار. [89]
يمكن أن تكون البيانات الثابتة مع فصل الهوية عن الحالة ومخططات عدم المشاركة أكثر ملاءمة للبرمجة المتزامنة والمتوازية من خلال تقليل أو القضاء على مخاطر التزامن معينة، حيث تكون العمليات المتزامنة ذرية عادةً وهذا يسمح بالقضاء على الحاجة إلى الأقفال. هذه هي الطريقة التي java.util.concurrentيتم بها تنفيذ الفئات على سبيل المثال، حيث يكون بعضها متغيرات ثابتة للفئات المقابلة غير المناسبة للاستخدام المتزامن. [90] غالبًا ما تحتوي لغات البرمجة الوظيفية على نموذج تزامن يستفيد بدلاً من الحالة المشتركة والمزامنة من آليات تمرير الرسائل (مثل نموذج الممثل ، حيث يكون كل ممثل حاوية للحالة والسلوك والجهات الفاعلة الفرعية وطابور الرسائل). [91] [92] هذا النهج شائع في Erlang / Elixir أو Akka .
قد يؤدي التقييم الكسول أيضًا إلى تسريع البرنامج، حتى بشكل مقارب، في حين أنه قد يبطئه على الأكثر بعامل ثابت (ومع ذلك، فقد يؤدي إلى تسريبات للذاكرة إذا تم استخدامه بشكل غير صحيح). يناقش Launchbury 1993 [66] القضايا النظرية المتعلقة بتسريبات الذاكرة من التقييم الكسول، ويقدم O'Sullivan et al. 2008 [93] بعض النصائح العملية لتحليلها وإصلاحها. ومع ذلك، فإن أكثر التطبيقات العامة للتقييم الكسول باستخدام مكثف للكود والبيانات التي تمت إزالتها تعمل بشكل سيئ على المعالجات الحديثة ذات خطوط الأنابيب العميقة وذاكرات التخزين المؤقت متعددة المستويات (حيث قد يكلف خطأ ذاكرة التخزين المؤقت مئات الدورات) [ بحاجة لمصدر ] .
تكلفة التجريد
قد لا تتمكن بعض لغات البرمجة الوظيفية من تحسين التجريدات مثل الدوال ذات الترتيب الأعلى مثل " map " أو " filter " بنفس كفاءة العمليات الإلزامية الأساسية. فكر، على سبيل المثال، في الطريقتين التاليتين للتحقق مما إذا كان الرقم 5 عددًا زوجيًا في Clojure :
( زوجي؟ 5 ) ( .يساوي ( mod 5 2 ) 0 )
عند إجراء معايرة باستخدام أداة Criterium على جهاز كمبيوتر يعمل بنظام التشغيل Ryzen 7900X GNU/Linux في Leiningen REPL 2.11.2، يعمل على إصدار Java VM 22 وإصدار Clojure 1.11.1، كان التنفيذ الأول، والذي تم تنفيذه على النحو التالي:
( defn even?
"ترجع قيمة true إذا كان n عددًا زوجيًا، وتطرح استثناءً إذا لم يكن n عددًا صحيحًا" { :added "1.0" :static true } [ n ] ( if ( integer? n ) ( zero? ( bit-and ( clojure.lang.RT/uncheckedLongCast n ) 1 )) ( throw ( IllegalArgumentException. ( str "يجب أن تكون الحجة عددًا صحيحًا: " n )))))
يبلغ متوسط وقت التنفيذ 4.76 مللي ثانية، بينما يبلغ متوسط وقت التنفيذ للطريقة الثانية، والتي .equalsهي استدعاء مباشر لطريقة Java الأساسية ، 2.8 ميكروثانية - أسرع بحوالي 1700 مرة. يمكن أن يُعزى جزء من ذلك إلى فحص النوع ومعالجة الاستثناءات المتضمنة في تنفيذ even?، لذا دعنا نأخذ على سبيل المثال مكتبة lo لـ Go ، والتي تنفذ العديد من الوظائف ذات الترتيب الأعلى الشائعة في لغات البرمجة الوظيفية باستخدام الأنواع العامة . في معيار مرجعي قدمه مؤلف المكتبة، mapيكون الاستدعاء أبطأ بنسبة 4٪ من forالحلقة المكافئة وله نفس ملف تعريف التخصيص ، [94] والذي يمكن أن يُعزى إلى تحسينات المترجم المختلفة، مثل التضمين المضمن . [95]
من السمات المميزة لـ Rust هي التجريدات الخالية من التكلفة . وهذا يعني أن استخدامها لا يفرض أي تكلفة إضافية أثناء التشغيل. ويتحقق ذلك بفضل استخدام المترجم لفك الحلقة ، حيث يتم تحويل كل تكرار للحلقة، سواء كانت إلزامية أو باستخدام متكررات، إلى تعليمات تجميع مستقلة ، دون التكلفة الإضافية للحلقة التي تتحكم في الكود. إذا كتبت عملية تكرارية إلى مصفوفة، فسيتم تخزين عناصر المصفوفة الناتجة في سجلات وحدة المعالجة المركزية المحددة ، مما يسمح بالوصول في وقت ثابت أثناء التشغيل. [96]
البرمجة الوظيفية في اللغات غير الوظيفية
من الممكن استخدام أسلوب وظيفي للبرمجة في اللغات التي لا تعتبر تقليديًا لغات وظيفية. [97] على سبيل المثال، يدعم كل من D [98] و Fortran 95 [59] بشكل صريح الوظائف النقية.
كانت لغات JavaScript و Lua و [99] وPython و Go [100] تحتوي على وظائف من الدرجة الأولى منذ نشأتها. [101] كان لدى Python دعم لـ " lambda " و" map " و" reduce " و" filter " في عام 1994، بالإضافة إلى الإغلاقات في Python 2.2، [102] على الرغم من أن Python 3 أحال "reduce" إلى functoolsوحدة المكتبة القياسية. [103] تم تقديم وظائف من الدرجة الأولى في لغات رئيسية أخرى مثل PHP 5.3 و Visual Basic 9 و C# 3.0 و C++11 و Kotlin . [28] [ بحاجة لمصدر ]
في PHP، يتم دعم الفئات المجهولة والإغلاقات وعلامات lambda بشكل كامل. يتم تطوير المكتبات وامتدادات اللغة لهياكل البيانات الثابتة للمساعدة في البرمجة بالأسلوب الوظيفي.
في Java ، يمكن استخدام الفئات المجهولة أحيانًا لمحاكاة الإغلاقات؛ [104] ومع ذلك، لا تعد الفئات المجهولة دائمًا بدائل مناسبة للإغلاقات لأنها تتمتع بإمكانيات أكثر محدودية. [105] تدعم Java 8 تعبيرات lambda كبديل لبعض الفئات المجهولة. [106]
في C# ، ليست هناك حاجة إلى فئات مجهولة، لأن الإغلاقات واللامدا مدعومة بالكامل. يتم تطوير المكتبات وامتدادات اللغة لهياكل البيانات الثابتة للمساعدة في البرمجة بالأسلوب الوظيفي في C#.
يمكن التعبير عن العديد من أنماط التصميم الموجهة للكائنات من خلال مصطلحات البرمجة الوظيفية: على سبيل المثال، يحدد نمط الاستراتيجية ببساطة استخدام وظيفة من الدرجة الأعلى، ويتوافق نمط الزائر تقريبًا مع التشكل أو الطي .
على نحو مماثل، غالبًا ما يتم تضمين فكرة البيانات غير القابلة للتغيير من البرمجة الوظيفية في لغات البرمجة الآمرة، [107] على سبيل المثال، المجموعة في بايثون، وهي عبارة عن مصفوفة غير قابلة للتغيير، وObject.freeze() في جافا سكريبت. [108]
مقارنة بالبرمجة المنطقية
يمكن النظر إلى البرمجة المنطقية باعتبارها تعميمًا للبرمجة الوظيفية، حيث تكون الدوال حالة خاصة للعلاقات. [109] على سبيل المثال، يمكن تمثيل الدالة، mother(X) = Y، (كل X لها أم Y واحدة فقط) بالعلاقة mother(X, Y). في حين أن الدوال لها نمط إدخال وإخراج صارم من الحجج، يمكن الاستعلام عن العلاقات بأي نمط من المدخلات والمخرجات. ضع في اعتبارك برنامج المنطق التالي:
الأم ( تشارلز ، إليزابيث ).
الأم ( هاري ، ديانا ).
يمكن الاستعلام عن البرنامج، مثل أي برنامج وظيفي، لتوليد الأمهات من الأطفال:
؟- الأم ( هاري ، X ).
X = ديانا .
؟- الأم ( تشارلز ، X ).
X = إليزابيث .
ولكن يمكن أيضًا الاستعلام عنه بشكل عكسي ، لتوليد الأطفال:
؟- الأم ( X ، إليزابيث ).
X = تشارلز .
؟- الأم ( X ، ديانا ).
X = هاري .
يمكن استخدامه أيضًا لإنشاء جميع حالات العلاقة الأم:
?- الأم ( X , Y ).
س = تشارلز ،
ص = إليزابيث .
س = هاري ،
ص = ديانا .
بالمقارنة مع بناء الجملة العلائقي، فإن بناء الجملة الوظيفية هو تدوين أكثر إحكامًا للوظائف المتداخلة. على سبيل المثال، يمكن كتابة تعريف الجدة الأمومية في بناء الجملة الوظيفية في الشكل المتداخل:
الجدة_الأمية ( X ) = الأم ( الأم ( X )).
يجب كتابة نفس التعريف في التدوين العلائقي في النموذج غير المتداخل:
الجدة_الأمية ( X ، Y ) :- الأم ( X ، Z )، الأم ( Z ، Y ).
هنا :-يعني إذا و , يعني و .
ومع ذلك، فإن الاختلاف بين التمثيلين هو ببساطة نحوي. في Ciao Prolog، يمكن تضمين العلاقات، مثل الوظائف في البرمجة الوظيفية: [110]
الجد ( X ) := الوالد ( الوالد ( X )).
الوالد ( X ) := الأم ( X ).
الوالد ( X ) := الأب ( X ).
الأم ( تشارلز ) := إليزابيث .
الأب ( تشارلز ) := فيليب .
الأم ( هاري ) := ديانا .
الأب ( هاري ) := تشارلز .
؟- الجد ( X ، Y ).
X = هاري ،
Y = إليزابيث .
X = هاري ،
Y = فيليب .
يقوم Ciao بتحويل تدوين الوظيفة إلى شكل علائقي وينفذ برنامج المنطق الناتج باستخدام استراتيجية التنفيذ القياسية في Prolog.
التطبيقات
محررات النصوص
Emacs ، وهي عائلة محررات نصوص قابلة للتوسع بشكل كبير تستخدم لهجتها الخاصة من لغة Lisp لكتابة المكونات الإضافية. يعتبر ريتشارد ستالمان، المؤلف الأصلي لأشهر تطبيقات Emacs، GNU Emacs وEmax Lisp، لغة Lisp واحدة من لغات البرمجة المفضلة لديه. [111]
Helix، منذ الإصدار 24.03، يدعم معاينة AST كتعبيرات S ، والتي تعد أيضًا الميزة الأساسية لعائلة لغة البرمجة Lisp. [112]
جداول البيانات
يمكن اعتبار جداول البيانات شكلاً من أشكال نظام البرمجة الوظيفية الصرفة من الدرجة صفر والتقييم الصارم. [113] ومع ذلك، تفتقر جداول البيانات عمومًا إلى وظائف من الدرجة الأعلى بالإضافة إلى إعادة استخدام التعليمات البرمجية، وفي بعض التطبيقات، تفتقر أيضًا إلى التكرار. تم تطوير العديد من الامتدادات لبرامج جداول البيانات لتمكين الوظائف من الدرجة الأعلى والقابلة لإعادة الاستخدام، ولكنها تظل حتى الآن أكاديمية في طبيعتها في المقام الأول. [114]
الخدمات المصغرة
بسبب قابليتها للتكوين ، يمكن أن تكون نماذج البرمجة الوظيفية مناسبة للهندسة المعمارية القائمة على الخدمات المصغرة . [115]
الأكاديمية
البرمجة الوظيفية هي مجال بحثي نشط في مجال نظرية لغة البرمجة . هناك العديد من أماكن النشر التي تمت مراجعتها من قبل النظراء والتي تركز على البرمجة الوظيفية، بما في ذلك المؤتمر الدولي للبرمجة الوظيفية ، ومجلة البرمجة الوظيفية ، وندوة الاتجاهات في البرمجة الوظيفية .
صناعة
تم استخدام البرمجة الوظيفية في مجموعة واسعة من التطبيقات الصناعية. على سبيل المثال، تم استخدام إرلانج ، الذي طورته شركة إريكسون السويدية في أواخر الثمانينيات، في الأصل لتنفيذ أنظمة الاتصالات المقاومة للأخطاء ، [11] ولكنه أصبح منذ ذلك الحين شائعًا لبناء مجموعة من التطبيقات في شركات مثل نورتيل وفيسبوك وكهرباء فرنسا وواتساب . [10] [12] [116] [117] [118] تم استخدام سكيم ، وهي لهجة من لغة ليسب ، كأساس للعديد من التطبيقات على أجهزة كمبيوتر أبل ماكنتوش المبكرة [ 3 ] [ 4] وتم تطبيقها على مشاكل مثل برامج محاكاة التدريب [5] والتحكم في التلسكوب . [6] تم استخدام أوكامل ، الذي تم تقديمه في منتصف التسعينيات، تجاريًا في مجالات مثل التحليل المالي، [14] والتحقق من السائق ، وبرمجة الروبوتات الصناعية والتحليل الثابت للبرامج المضمنة . [15] Haskell ، على الرغم من أنه كان من المقصود في البداية أن تكون لغة بحثية، [17] فقد تم تطبيقها أيضًا في مجالات مثل أنظمة الطيران وتصميم الأجهزة وبرمجة الويب. [16] [17]
تشمل لغات البرمجة الوظيفية الأخرى التي شهدت استخدامًا في الصناعة Scala و [119] F# و [18] [19] Wolfram Language و [7] Lisp و [120] Standard ML [121] [122] و Clojure. [123] تم استخدام Scala على نطاق واسع في علم البيانات ، [124] بينما ClojureScript و [125] Elm [126] أو PureScript [127] هي بعض لغات البرمجة الأمامية الوظيفية المستخدمة في الإنتاج. يستخدم إطار عمل Phoenix الخاص بـ Elixir أيضًا من قبل بعض المشاريع التجارية الشائعة نسبيًا، مثل Font Awesome أو Allegro (واحدة من أكبر منصات التجارة الإلكترونية في بولندا) [128] ومنصة الإعلانات المبوبة Allegro Lokalnie. [129]
كانت "المنصات" الوظيفية شائعة الاستخدام في مجال التمويل لتحليل المخاطر (خاصة مع البنوك الاستثمارية الكبيرة). يتم ترميز عوامل الخطر كوظائف تشكل رسومًا بيانية مترابطة (فئات) لقياس الارتباطات في تحولات السوق، على غرار تحسينات أساس جروبنر ولكن أيضًا للأطر التنظيمية مثل التحليل والمراجعة الشاملة لرأس المال . نظرًا لاستخدام الاختلافات في OCaml و Caml في التمويل، تعتبر هذه الأنظمة أحيانًا مرتبطة بآلة مجردة تصنيفية . تتأثر البرمجة الوظيفية بشكل كبير بنظرية الفئة . [ بحاجة لمصدر ]
تعليم
تدرس العديد من الجامعات البرمجة الوظيفية. [130] [131] [132] [133] يعاملها البعض كمفهوم برمجة تمهيدي [133] بينما يدرس البعض الآخر أولاً أساليب البرمجة الآمرة. [132] [134]
خارج علوم الكمبيوتر، تُستخدم البرمجة الوظيفية لتدريس حل المشكلات والمفاهيم الجبرية والهندسية. [135] كما تم استخدامها لتدريس الميكانيكا الكلاسيكية، كما هو الحال في كتاب بنية وتفسير الميكانيكا الكلاسيكية .
على وجه الخصوص، كان Scheme خيارًا شائعًا نسبيًا لتدريس البرمجة لسنوات. [136] [137]
انظر أيضا
- تقييم حريص
- البرمجة التفاعلية الوظيفية
- البرمجة الوظيفية الاستقرائية
- قائمة لغات البرمجة الوظيفية
- قائمة مواضيع البرمجة الوظيفية
- وظيفة متداخلة
- برمجة وظيفية بحتة
الملاحظات والمراجع
- ^ Hudak, Paul (سبتمبر 1989). "Conception, evolution, and application of function programming language" (PDF) . ACM Computing Surveys . 21 (3): 359–411. doi :10.1145/72551.72554. S2CID 207637854. مؤرشف من الأصل (PDF) في 2016-01-31 . تم الاسترجاع في 2013-08-10 .
- ^ ab Hughes, John (1984). "لماذا البرمجة الوظيفية مهمة".
- ^ ab Clinger, Will (1987). "MultiTasking and MacScheme". MacTech . 3 (12) . تم الاسترجاع في 2008-08-28 .
- ^ ab Hartheimer, Anne (1987). "برمجة محرر نصوص في MacScheme+Toolsmith". MacTech . 3 (1). مؤرشف من الأصل في 2011-06-29 . تم الاسترجاع في 2008-08-28 .
- ^ ab Kidd, Eric. Terrorism Response Training in Scheme. CUFP 2007. مؤرشف من الأصل في 2010-12-21 . تم الاسترجاع في 2009-08-26 .
- ^ ab Cleis, Richard. Scheme in Space. CUFP 2006. مؤرشف من الأصل في 2010-05-27 . تم الاسترجاع في 2009-08-26 .
- ^ "Wolfram Language Guide: Functional Programming". 2015. تم الاسترجاع في 2015-08-24 .
- ^ "لغة البرمجة الوظيفية مقابل لغة البرمجة الإجرائية". قسم الرياضيات التطبيقية . جامعة كولورادو. مؤرشف من الأصل في 2007-11-13 . تم الاسترجاع في 2006-08-28 .
- ^ "State-Based Scripting in Uncharted 2" (PDF) . مؤرشف من الأصل (PDF) في 2012-12-15 . تم الاسترجاع في 2011-08-08 .
- ^ ab "من يستخدم إرلانج لتطوير المنتجات؟". الأسئلة الشائعة حول إرلانج . تم الاسترجاع في 2018-04-27 .
- ^ ab Armstrong, Joe (June 2007). "A history of Erlang". Proceedings of the third ACM SIGPLAN conference on History of programming language . Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. doi :10.1145/1238844.1238850. ISBN 9781595937667.
- ^ ab Larson, Jim (مارس 2009). "Erlang for concurrent programming". Communications of the ACM . 52 (3): 48. doi : 10.1145/1467247.1467263 . S2CID 524392.
- ^ "لغة البرمجة Elixir" . تم الاسترجاع في 2021-02-14 .
- ^ ab Minsky, Yaron; Weeks, Stephen (يوليو 2008). "Caml Trading — تجارب مع البرمجة الوظيفية في وول ستريت". مجلة البرمجة الوظيفية . 18 (4): 553–564. doi : 10.1017/S095679680800676X (غير نشط 1 نوفمبر 2024). S2CID 30955392.
{{cite journal}}:CS1 maint: DOI غير نشط اعتبارًا من نوفمبر 2024 ( الرابط ) - ^ ab Leroy, Xavier. Some usages of Caml in Industry (PDF) . CUFP 2007. مؤرشف من الأصل (PDF) في 2011-10-08 . تم الاسترجاع في 2009-08-26 .
- ^ ab "Haskell in industry". Haskell Wiki . تم الاسترجاع في 2009-08-26 .
تستخدم لغة Haskell في مجموعة متنوعة من الاستخدامات التجارية، من الفضاء والدفاع، إلى التمويل، إلى الشركات الناشئة على شبكة الإنترنت، وشركات تصميم الأجهزة، ومصنعي جزازات العشب.
- ^ abc Hudak, Paul ; Hughes, J.; Jones, SP; Wadler, P. (يونيو 2007). تاريخ هاسكل: الكسل مع الفصل. مؤتمر ACM SIGPLAN الثالث حول تاريخ لغات البرمجة. سان دييغو، كاليفورنيا. doi :10.1145/1238844.1238856 . تم الاسترجاع في 2013-09-26 .
- ^ أ ب مانسيل، هوارد (2008). التمويل الكمي في F#. CUFP 2008. مؤرشف من الأصل في 2015-07-08 . تم الاسترجاع في 2009-08-29 .
- ^ ab Peake, Alex (2009). The First Substantial Line of Business Application in F#. CUFP 2009. مؤرشف من الأصل في 2009-10-17 . تم الاسترجاع في 2009-08-29 .
- ^ دي مورا، ليوناردو؛ أولريش، سيباستيان (يوليو 2021). "مثبت نظرية لين 4 ولغة البرمجة". محاضرات في الذكاء الاصطناعي . مؤتمر حول الاستنتاج الآلي. المجلد 12699. ص 625-635. doi : 10.1007/978-3-030-79876-5_37 . ISSN 1611-3349.
- ^ Banz, Matt (2017-06-27). "مقدمة إلى البرمجة الوظيفية في JavaScript". Opensource.com . تم الاسترجاع في 2021-01-09 .
- ^ "يتضمن جدول مؤتمر useR! 2006 أوراقًا بحثية حول الاستخدام التجاري لـ R". R-project.org. 2006-06-08 . تم الاسترجاع في 2011-06-20 .
- ^ تشامبرز، جون م. (1998). البرمجة باستخدام البيانات: دليل إلى لغة S. دار نشر سبرينغر. ص 67-70. رقم ISBN 978-0-387-98503-9.
- ^ نوفاتشيف، ديميتري. "لغة البرمجة الوظيفية XSLT — دليل من خلال الأمثلة" . تم الاسترجاع في 27 مايو 2006 .
- ^ ميرتز، ديفيد. "أنماط برمجة XML (الجزء الرابع): البرمجة الوظيفية التي تم التعامل معها لمعالجة XML". IBM developerWorks . تم الاسترجاع في 27 مايو 2006 .
- ^ تشامبرلين، دونالد د .؛ بويس، رايموند ف. (1974). "SEQUEL: لغة استعلام إنجليزية منظمة". وقائع مؤتمر ACM SIGFIDET لعام 1974 : 249–264.
- ^ البرمجة الوظيفية باستخدام C# - Simon Painter - NDC Oslo 2020، 8 أغسطس 2021، مؤرشف من الأصل في 2021-10-30 ، تم استرجاعه في 2021-10-23
- ^ ab "البرمجة الوظيفية - لغة برمجة كوتلين". Kotlin . تم الاسترجاع في 2019-05-01 .
- ^ دومينوس، مارك ج. (2005). لغة بيرل من الدرجة الأعلى . مورجان كوفمان . رقم ISBN 978-1-55860-701-9.
- ^ هوليويل ، سيمون (2014). البرمجة الوظيفية في PHP . بي إتش بي [مهندس معماري]. رقم ISBN 9781940111056.
- ^ The Cain Gang Ltd. "Python Metaclasses: Who? Why? When?" (PDF) . مؤرشف من الأصل (PDF) في 30 مايو 2009 . تم الاسترجاع في 27 يونيو 2009 .
- ^ "GopherCon 2020: Dylan Meeus - Functional Programming with Go". يوتيوب . 22 ديسمبر 2020.
- ^ "ميزات اللغة الوظيفية: المتكررات والإغلاقات - لغة برمجة Rust". doc.rust-lang.org . تم الاسترجاع في 2021-01-09 .
- ^ Vanderbauwhede, Wim (18 يوليو 2020). "كود أنظف مع البرمجة الوظيفية". مؤرشف من الأصل في 28 يوليو 2020. تم الاسترجاع 6 أكتوبر 2020 .
- ^ "Effective Scala". Scala Wiki . مؤرشف من الأصل في 2012-06-19 . تم الاسترجاع في 2012-02-21 .
Effective Scala.
- ^ "الوثائق الخاصة بالحزمة java.util.function منذ Java 8 (المعروفة أيضًا باسم Java 1.8)" . تم الاسترجاع في 2021-06-16 .
- ^ تورينج، إيه إم (1937). "قابلية الحساب وقابلية تعريف λ". مجلة المنطق الرمزي . 2 (4). مطبعة جامعة كامبريدج: 153-163. doi :10.2307/2268280. JSTOR 2268280. S2CID 2317046.
- ^ هاسكل بروكس كاري؛ روبرت فيز (1958). المنطق التوافقي . شركة النشر في شمال هولندا . تم الاسترجاع في 10 فبراير 2013 .
- ^ Church, A. (1940). "صياغة النظرية البسيطة للأنواع". مجلة المنطق الرمزي . 5 (2): 56–68. doi :10.2307/2266170. JSTOR 2266170. S2CID 15889861.
- ^ McCarthy, John (يونيو 1978). تاريخ لغة ليسب (PDF) . تاريخ لغات البرمجة . لوس أنجلوس، كاليفورنيا. ص. 173–185. doi :10.1145/800025.808387.
- ^ جون مكارثي (1960). "الدوال المتكررة للتعبيرات الرمزية وحسابها بواسطة الآلة، الجزء الأول". (PDF) . اتصالات ACM . 3 (4). ACM New York, NY, US: 184–195. doi :10.1145/367177.367199. S2CID 1489409.
- ^ جاي إل ستيل؛ ريتشارد ب. غابرييل (فبراير 1996). "تطور لغة ليسب". تاريخ لغات البرمجة---II (PDF) . ص. 233-330. doi :10.1145/234286.1057818. ISBN 978-0-201-89502-5. S2CID 47047140.
- ^ تزعم مذكرات هربرت أ. سيمون (1991)، نماذج حياتي ص 189-190 ISBN 0-465-04640-1 أنه وآل نيويل وكليف شو "... يُحكم عليهم عمومًا بأنهم آباء [مجال] الذكاء الاصطناعي"، لكتابة Logic Theorist ، وهو برنامج أثبت نظريات من Principia Mathematica تلقائيًا. لتحقيق هذه الغاية، كان عليهم اختراع لغة ونموذج يدمجان البرمجة الوظيفية، عند النظر إليهما بأثر رجعي.
- ^ Landin, Peter J. (1964). "التقييم الميكانيكي للتعبيرات". مجلة الكمبيوتر . 6 (4). الجمعية البريطانية للحاسب الآلي : 308-320. doi : 10.1093/comjnl/6.4.308 .
- ^ Diehl, Stephan; Hartel, Pieter; Sestoft, Peter (2000). "Abstract machines for programming language implementation". Future Generation Computer Systems . المجلد 16. ص 739-751.
- ^ Landin, Peter J. (فبراير 1965أ). "المراسلات بين ALGOL 60 وترميز لامدا الخاص بـ Church: الجزء الأول". اتصالات ACM . 8 (2). رابطة آلات الحوسبة : 89–101. doi : 10.1145/363744.363749 . S2CID 6505810.
- ^ Landin, Peter J. (مارس 1965ب). "التوافق بين ALGOL 60 وترميز لامدا الخاص بـ Church: الجزء الثاني". اتصالات ACM . 8 (3). رابطة آلات الحوسبة : 158–165. doi : 10.1145/363791.363804 . S2CID 15781851.
- ^ Landin, Peter J. (مارس 1966ب). "لغات البرمجة السبعمائة التالية". اتصالات جمعية آلات الحوسبة . 9 (3). جمعية آلات الحوسبة : 157–166. doi : 10.1145/365230.365257 . S2CID 13409665.
- ^ Backus, J. (1978). "هل يمكن تحرير البرمجة من أسلوب فون نيومان؟: أسلوب وظيفي وجبر البرامج". اتصالات جمعية الحوسبة الآلية . 21 (8): 613-641. doi : 10.1145/359576.359579 .
- ^ RM Burstall. اعتبارات التصميم للغة برمجة وظيفية. ورقة بحثية مدعوة، وقائع مؤتمر Infotech State of the Art Conf. "ثورة البرمجيات"، كوبنهاجن، 45-57 (1977)
- ^ RM Burstall و J. Darlington. نظام تحويل لتطوير برامج متكررة. مجلة جمعية آلات الحوسبة 24(1):44–67 (1977)
- ^ RM Burstall و DB MacQueen و DT Sannella. HOPE: لغة تطبيقية تجريبية. وقائع مؤتمر LISP لعام 1980، ستانفورد، 136-143 (1980).
- ^ "جعل اكتشاف assign() أسهل!". OpenSCAD . مؤرشف من الأصل في 2023-04-19.
- ^ بيتر برايت (13 مارس 2018). "يحب المطورون اللغات الجديدة العصرية ولكنهم يكسبون المزيد من خلال البرمجة الوظيفية". Ars Technica .
- ^ جون ليونارد (24 يناير 2017). "الصعود الخفي للبرمجة الوظيفية". الحوسبة.
- ^ ليو تشيونج (9 مايو 2017). "هل البرمجة الوظيفية أفضل لشركتك الناشئة؟". إنفوورلد .
- ^ شون تول - الفئات الأحادية لتحليل المفاهيم الرسمية.
- ^ Pountain, Dick. "Functional Programming Comes of Age". Byte (أغسطس 1994) . مؤرشف من الأصل في 2006-08-27 . تم الاسترجاع في 31 أغسطس 2006 .
- ^ ab "ISO/IEC JTC 1/SC 22/WG5/N2137 – Fortran 2015 Committee Draft (J3/17-007r2)" (PDF) . المنظمة الدولية للمعايير. 6 يوليو 2017. ص 336-338.
- ^ "تقرير منقح حول مخطط اللغة الخوارزمية". R6rs.org . تم الاسترجاع في 2013-03-21 .
- ^ "تقرير منقح حول مخطط اللغة الخوارزمية - الأساس المنطقي". R6rs.org . تم الاسترجاع في 2013-03-21 .
- ^ Clinger, William (1998). "Proper tail recursion and space efficient". Proceedings of the ACM SIGPLAN 1998 conference on Programming language design and implementation - PLDI '98 . ص. 174–185. doi :10.1145/277650.277719. ISBN 0897919874. S2CID 16812984.
- ^ بيكر، هنري (1994). "CONS Should Not CONS Its Arguments, Part II: Cheney on MTA" مؤرشف من الأصل في 2006-03-03 . تم الاسترجاع في 2020-04-29 .
- ^ Turner, DA (2004-07-28). "Total Functional Programming". مجلة علوم الكمبيوتر العالمية . 10 (7): 751–768. doi :10.3217/jucs-010-07-0751.
- ^ تنفيذ لغات البرمجة الوظيفية. سيمون بيتون جونز، نشر برنتيس هول، 1987
- ^ ab Launchbury, John (March 1993). A Natural Semantics for Lazy Evaluation . ندوة حول مبادئ لغات البرمجة. تشارلستون، ساوث كارولينا: ACM . ص 144-154. doi : 10.1145/158511.158618 .
- ^ روبرت دبليو هاربر (2009). أساسيات عملية للغات البرمجة (PDF) . مؤرشف من الأصل (PDF) في 2016-04-07.
- ^ هويت، جيرارد ب. (1973). "عدم القدرة على اتخاذ القرار بشأن التوحيد في منطق الدرجة الثالثة". المعلومات والتحكم . 22 (3): 257-267. doi :10.1016/s0019-9958(73)90301-x.
- ^ هيوت ، جيرار (سبتمبر 1976). قرار المعادلات في اللغات الذهبية 1،2،...ω (دكتوراه) (بالفرنسية). جامعة باريس السابعة.
- ^ هويت، جيرارد (2002). "توحيد النظام الأعلى بعد 30 عامًا" (PDF) . في كارينيو، ف.؛ مونوز، س.؛ طاهر، س. (المحررون). وقائع المؤتمر الدولي الخامس عشر TPHOL . LNCS. المجلد 2410. سبرينغر. ص 3-12.
- ^ Wells, JB (1993). "قابلية الكتابة وفحص النوع في حساب لامدا من الدرجة الثانية متكافئان وغير قابلين للحسم". Tech. Rep. 93-011 : 176–185. CiteSeerX 10.1.1.31.3590 .
- ^ لوروي، زافييه (17 سبتمبر 2018). "المترجم المعتمد من Compcert".
- ^ بيتون جونز، سيمون؛ فيتينيوتيس، ديميتريوس؛ ويريتش، ستيفاني ؛ جيفري واشبورن (أبريل 2006). "استدلال النوع البسيط القائم على التوحيد لـ GADTs". Icfp 2006 : 50–61.
- ^ "دليل OCaml". caml.inria.fr . تم الاسترجاع في 2021-03-08 .
- ^ "أنواع البيانات الجبرية". توثيق سكالا . تم الاسترجاع في 2021-03-08 .
- ^ كينيدي، أندرو؛ روسو، كلاوديو ف. (أكتوبر 2005). أنواع البيانات الجبرية المعممة والبرمجة الموجهة للكائنات (PDF) . OOPSLA. سان دييغو، كاليفورنيا: ACM . doi :10.1145/1094811.1094814. ISBN 9781595930316. تم أرشفة النسخة الأصلية في 2006-12-29.
- ^ هيوز، جون. "لماذا البرمجة الوظيفية مهمة" (PDF) . جامعة تشالمرز للتكنولوجيا .
- ^ هياكل البيانات الوظيفية البحتة بقلم كريس أوكاساكي ، مطبعة جامعة كامبريدج ، 1998، ISBN 0-521-66350-4
- ^ L'orange, Jean Niklas. "polymatheia - Understanding Clojure's Persistent Vector, pt. 1". Polymatheia . تم الاسترجاع في 2018-11-13 .
- ^ مايكل بار، تشارلز ويل - نظرية الفئات لعلوم الكمبيوتر.
- ^ نيوبيرن، ج. "كل شيء عن المونادات: دليل شامل لنظرية وممارسة البرمجة المونادية في هاسكل" . تم الاسترجاع في 14 فبراير 2008 .
- ^ "ثلاث عشرة طريقة للنظر إلى السلحفاة". fF# من أجل المتعة والربح . تم الاسترجاع في 2018-11-13 .
- ^ بولسون، لاري سي. (28 يونيو 1996). ML for the Working Programmer. مطبعة جامعة كامبريدج. ISBN 978-0-521-56543-1تم الاسترجاع بتاريخ 10 فبراير 2013 .
- ^ Spiewak, Daniel (26 أغسطس 2008). "تنفيذ المتجهات المستمرة في سكالا". Code Commit . مؤرشف من الأصل في 23 سبتمبر 2015 . تم الاسترجاع في 17 أبريل 2012 .
- ^ "ما هي البرامج الأسرع؟ | لعبة معايير لغة الحاسوب". benchmarksgame.alioth.debian.org. مؤرشف من الأصل في 2013-05-20 . تم الاسترجاع في 2011-06-20 .
- ^ إيغور بيتشتشانسكي؛ فيفيك ساركار (2005). "مواصفات الثبات وتطبيقاتها". التزامن والحوسبة: الممارسة والخبرة . 17 (5-6): 639-662. doi :10.1002/cpe.853. S2CID 34527406.
- ^ "نظرة متعمقة على مجموعات Clojure". InfoQ . تم الاسترجاع في 2024-04-29 .
- ^ "المراجع والاقتباس - لغة برمجة Rust". doc.rust-lang.org . تم الاسترجاع في 2024-04-29 .
- ^ "التحقق من صحة المراجع باستخدام أعمار الكائنات - لغة برمجة Rust". doc.rust-lang.org . تم الاسترجاع في 2024-04-29 .
- ^ "المجموعات المتزامنة (دروس Java™ > فئات Java الأساسية > التزامن)". docs.oracle.com . تم الاسترجاع في 2024-04-29 .
- ^ "فهم نموذج الممثل لبناء أنظمة موزعة عالية الإنتاجية وغير مانعة - Scaleyourapp". scaleyourapp.com . 2023-01-28 . تم الاسترجاع في 2024-04-29 .
- ^ Cesarini, Francesco; Thompson, Simon (2009). Erlang programming: a concurrent approach to software development (1st ed.). O'Reilly Media, Inc. (published 2009-06-11). p. 6. ISBN 978-0-596-55585-6.
- ^ "الفصل 25. تحديد الملفات الشخصية والتحسين". Book.realworldhaskell.org . تم الاسترجاع في 2011-06-20 .
- ^ بيرث ، صموئيل (29/04/2024)، سامبر / لو ، استرجاعها 29/04/2024
- ^ "Go Wiki: Compiler And Runtime Optimizations - The Go Programming Language". go.dev . تم الاسترجاع في 2024-04-29 .
- ^ "مقارنة الأداء: الحلقات مقابل التكرارات - لغة برمجة Rust". doc.rust-lang.org . تم الاسترجاع في 2024-04-29 .
- ^ هارتل، بيتر؛ هنك مولر؛ هيو جلاسر (مارس 2004). "تجربة سي الوظيفية" (PDF) . مجلة البرمجة الوظيفية . 14 (2): 129–135. doi :10.1017/S0956796803004817. S2CID 32346900. مؤرشف من الأصل (PDF) في 2011-07-19 . تم الاسترجاع في 2006-05-28 .؛ ديفيد ميرتز. "البرمجة الوظيفية في بايثون، الجزء 3". IBM developerWorks . مؤرشف من الأصل في 2007-10-16 . تم الاسترجاع في 2006-09-17 .(الجزء الأول، الجزء الثاني)
- ^ "الوظائف – لغة البرمجة D 2.0". Digital Mars. 30 ديسمبر 2012.
- ^ "الأسئلة الشائعة غير الرسمية للغة Lua (uFAQ)".
- ^ "الدوال من الدرجة الأولى في جو - لغة برمجة جو". golang.org . تم الاسترجاع في 2021-01-04 .
- ^ آيش، بريندان (3 أبريل 2008). "الشعبية".
- ^ van Rossum, Guido (2009-04-21). "أصول الميزات "الوظيفية" في Python" . تم الاسترجاع في 2012-09-27 .
- ^ "functools — وظائف وعمليات من الدرجة الأعلى على الكائنات القابلة للاستدعاء". مؤسسة برامج بايثون. 2011-07-31 . تم الاسترجاع في 2011-07-31 .
- ^ Skarsaune, Martin (2008). مشروع SICS Java Port للترجمة الآلية لنظام موجه للكائنات كبير الحجم من Smalltalk إلى Java .
- ^ جوسلينج، جيمس. "الإغلاقات". جيمس جوسلينج: على طريق جافا . أوراكل. مؤرشف من الأصل في 2013-04-14 . تم الاسترجاع في 11 مايو 2013 .
- ^ ويليامز، مايكل (8 أبريل 2013). "البدء السريع في Java SE 8 Lambda".
- ^ بلوخ، جوشوا (2008). "البند 15: تقليل قابلية التغيير". جافا الفعالة (الطبعة الثانية). أديسون ويسلي. رقم ISBN 978-0321356680.
- ^ "Object.freeze() - JavaScript | MDN". developer.mozilla.org . تم الاسترجاع في 2021-01-04 .
تعمل طريقة Object.freeze() على تجميد الكائن. لا يمكن تغيير الكائن المتجمد بعد الآن؛ حيث يمنع تجميد الكائن إضافة خصائص جديدة إليه، وإزالة الخصائص الموجودة، ويمنع تغيير قابلية العد أو التكوين أو الكتابة للخصائص الموجودة، ويمنع تغيير قيم الخصائص الموجودة. بالإضافة إلى ذلك، يمنع تجميد الكائن أيضًا تغيير النموذج الأولي الخاص به. تعيد طريقة Freeze() نفس الكائن الذي تم تمريره.
- ^ دانييل فريدمان؛ ويليام بيرد؛ أوليج كيسليوف؛ جيسون هيمان (2018). المخطط العقلاني، الطبعة الثانية . مطبعة معهد ماساتشوستس للتكنولوجيا.
- ^ أ. كاساس، د. كابيزا، إم. في. هيرمينيجيلدو. نهج نحوي لدمج التدوين الوظيفي والتقييم الكسول والترتيب الأعلى في أنظمة البرمجة الوظيفية والمنطقية. الندوة الدولية الثامنة حول البرمجة الوظيفية والمنطقية (FLOPS'06)، الصفحات 142-162، أبريل 2006.
- ^ "كيف أقوم بعمليات الحوسبة". stallman.org . تم الاسترجاع في 2024-04-29 .
- ^ "Helix". helix-editor.com . تم الاسترجاع في 2024-04-29 .
- ^ Wakeling, David (2007). "Spreadsheet function programming" (PDF) . مجلة البرمجة الوظيفية . 17 (1): 131–143. doi :10.1017/S0956796806006186. ISSN 0956-7968. S2CID 29429059.
- ^ Peyton Jones, Simon ; Burnett, Margaret ; Blackwell, Alan (March 2003). "تحسين لغة الوظائف الأكثر شعبية في العالم: الدوال المحددة من قبل المستخدم في Excel". مؤرشف من الأصل في 16 أكتوبر 2005.
- ^ روجر، ريتشارد (11 ديسمبر 2017). طاو الخدمات المصغرة . مانينغ. ISBN 9781638351733.
- ^ Piro, Christopher (2009). Functional Programming at Facebook. CUFP 2009. مؤرشف من الأصل في 2009-10-17 . تم الاسترجاع في 2009-08-29 .
- ^ "Sim-Diasca: محرك محاكاة متزامن للأحداث المنفصلة واسع النطاق في إرلانج". نوفمبر 2011.
- ^ 1 مليون هو 2011 محفوظ في 2014-02-19 على موقع Wayback Machine // مدونة WhatsApp، 2012-01-06: "الجزء المهم الأخير من بنيتنا التحتية هو إرلانج"
- ^ Momtahan, Lee (2009). Scala at EDF Trading: Implementing a Domain-Specific Language for Derivative Pricing with Scala. CUFP 2009. مؤرشف من الأصل في 2009-10-17 . تم الاسترجاع في 2009-08-29 .
- ^ جراهام، بول (2003). "التغلب على المتوسطات" . تم استرجاعه في 2009-08-29 .
- ^ سيمز، ستيف (2006). بناء شركة ناشئة باستخدام التعلم الآلي القياسي (PDF) . CUFP 2006. تم الاسترجاع في 2009-08-29 .
- ^ Laurikari, Ville (2007). Functional Programming in Communications Security. CUFP 2007. مؤرشف من الأصل في 2010-12-21 . تم الاسترجاع في 2009-08-29 .
- ^ لوريمر، آر جيه (19 يناير 2009). "الإعلان عن تطبيق إنتاجي مباشر للغة Clojure". InfoQ .
- ^ بوجنيون، باسكال (2016). سكالا لعلوم البيانات (الطبعة الأولى). باكيت . رقم ISBN 9781785281372.
- ^ "لماذا يفضل المطورون ClojureScript". StackShare . تم الاسترجاع في 2024-04-29 .
- ^ هيريك، جوستين (2024-04-29)، jah2488/elm-companies ، تم الاسترجاع في 2024-04-29
- ^ "لماذا يفضل المطورون PureScript". StackShare . تم الاسترجاع في 2024-04-29 .
- ^ فريق التحرير (2019-01-08). "ALLEGRO - كل ما تحتاج إلى معرفته عن أفضل سوق عبر الإنترنت في بولندا". أخبار التجارة الإلكترونية في ألمانيا . تم الاسترجاع في 2024-04-29 .
- ^ "المواقع الإلكترونية التي تستخدم إطار عمل Phoenix - Wappalyzer". www.wappalyzer.com . تم الاسترجاع في 2024-04-29 .
- ^ "البرمجة الوظيفية: 2019-2020". قسم علوم الكمبيوتر بجامعة أكسفورد . تم الاسترجاع في 28 أبريل 2020 .
- ^ "برمجة I (هاسكل)". قسم الحوسبة في إمبريال كوليدج لندن . تم الاسترجاع في 28 أبريل 2020 .
- ^ "بكالوريوس علوم الكمبيوتر - وحدات دراسية" . تم الاسترجاع في 28 أبريل 2020 .
- ^ أبيلسون، هال ؛ سوسمان، جيرالد جاي (1985). "مقدمة الطبعة الثانية". بنية وتفسير برامج الكمبيوتر (الطبعة الثانية). مطبعة معهد ماساتشوستس للتكنولوجيا.
- ^ جون دي نيرو (خريف 2019). "علوم الكمبيوتر 61A، بيركلي". قسم الهندسة الكهربائية وعلوم الكمبيوتر، بيركلي . تم الاسترجاع في 2020-08-14 .
- ^ إيمانويل شانزر من Bootstrap أجرى مقابلة في برنامج Triangulation التلفزيوني على شبكة TWiT.tv
- ^ "لماذا نحتاج إلى مخطط للبرمجة التمهيدية؟". home.adelphi.edu . تم الاسترجاع في 2024-04-29 .
- ^ طاقم العمل، IMACS (2011-06-03). "ما هو المخطط ولماذا هو مفيد للطلاب؟". IMACS – صنع مفكرين أفضل مدى الحياة . تم الاسترجاع في 2024-04-29 .
قراءة إضافية
- أبلسون، هال ؛ سوسمان، جيرالد جاي (1985). بنية وتفسير برامج الكمبيوتر. مطبعة معهد ماساتشوستس للتكنولوجيا.
- كوزينو، جاي وميشيل موني. النهج الوظيفي للبرمجة . كامبريدج، المملكة المتحدة: مطبعة جامعة كامبريدج ، 1998.
- كاري، هاسكل بروكس وفيز، روبرت وكريج، ويليام. المنطق التركيبي . المجلد الأول. شركة شمال هولندا للنشر، أمستردام، 1958.
- كاري، هاسكل ب .؛ هندلي، ج. روجر ؛ سيلدين، جوناثان ب. (1972). المنطق التوافقي . المجلد الثاني. أمستردام: هولندا الشمالية. رقم ISBN 978-0-7204-2208-5.
- دومينوس، مارك جيسون. بيرل من الدرجة الأعلى . مورجان كوفمان . 2005.
- فيليزن، ماتياس؛ فيندلر، روبرت؛ فلات، ماثيو؛ كريشنامورثي، شريرام (2018). كيفية تصميم البرامج. مطبعة معهد ماساتشوستس للتكنولوجيا.
- جراهام، بول. ANSI Common LISP . إنجلوود كليفس، نيو جيرسي: برنتيس هول ، 1996.
- ماكلينان، بروس ج. البرمجة الوظيفية: الممارسة والنظرية . أديسون ويسلي، 1990.
- مايكلسون، جريج (10 أبريل 2013). مقدمة إلى البرمجة الوظيفية من خلال حساب لامدا . شركة كورير. رقم ISBN 978-0-486-28029-5.
- أوسوليفان، بريان؛ ستيوارت، دون؛ جورزين، جون (2008). هاسكل في العالم الحقيقي. أوريلي.
- برات، تيرينس دبليو ومارفن فيكتور زيلكويتز . لغات البرمجة: التصميم والتنفيذ . الطبعة الثالثة. إنجلوود كليفس، نيو جيرسي: برنتيس هول ، 1996.
- سالوس، بيتر إتش . لغات البرمجة الوظيفية والمنطقية . المجلد الرابع من كتاب دليل لغات البرمجة. إنديانابوليس، إنديانا: دار ماكميلان للنشر التقني، 1998.
- تومسون، سيمون. هاسكل: حرفة البرمجة الوظيفية . هارلو، إنجلترا: أديسون ويسلي لونجمان المحدودة، 1996.
روابط خارجية
- فورد، نيل. "التفكير الوظيفي" . تم الاسترجاع في 2021-11-10 .
- أخمشيت، سلافا (19 يونيو 2006). "defmacro – البرمجة الوظيفية لبقية منا" . تم الاسترجاع في 24 فبراير 2013 .مقدمة
- البرمجة الوظيفية في بايثون (بقلم ديفيد ميرتز): الجزء الأول، الجزء الثاني، الجزء الثالث
