سؤال

هذا هو الوضع :أنا في الغالب أبرمج لغة C# وقد كتبت فيها أنواعًا لا أريد أن أخسرها.وفي نفس الوقت أود أن أتعلم البرمجة الوظيفية.الجواب الواضح بالطبع هو F#.

لكن بالنسبة لكل شيء باستثناء C#، أستخدم emacs كمحرر، وأود حقًا أن أتعلم Lisp أيضًا.(تعلم لغة المحررين/IDE التي تعرفها، ولهذا السبب أعرف القليل من لغة VB لكتابة VS-macro الخاص بي فيها) وهي ليست مجرد emacs، Lisp هو شيء أريد حقًا أن أتعلمه.

أما بالنسبة لـ F#، فيمكنني مزجها مع C# دون أي مشكلة في التشغيل المتداخل، ولدي واجهة مستخدم رسومية رائعة (WPF) والكثير من ميزات .NET الأخرى.لكنها بالطبع ليست ناضجة مثل ليسب.

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

هل هذا صحيح؟أم أن اللغتين غير قابلتين للمقارنة على الإطلاق؟

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

المحلول

Lisp هي عائلة كبيرة من اللغات والتطبيقات. المخطط على سبيل المثال هو لهجة Lisp مع أكثر من مائة تطبيق (حوالي عشرة منها شائعة إلى حد ما).Common Lisp هي لهجة أخرى بها حوالي عشرة تطبيقات يتم الحفاظ عليها حاليًا.قام كل من Scheme وCommon Lisp بكتابة معايير تحاول التطبيقات تنفيذها.

F# هي لغة وتنفيذ. من مايكروسوفت.تم اشتقاقها في الغالب من OCAML وتنتمي إلى عائلة لغات ML.

كانت Lisp لغة مبكرة جدًا تدعم البرمجة الوظيفية (Lisp 1.5 في الستينيات).تم إجراء الكثير من التجارب المبكرة للبرمجة الوظيفية باستخدام Lisp.في السبعينيات في مجتمع Lisp، كانت هناك حركة نحو جذور البرمجة الوظيفية وكانت النتيجة مخطط.ثم ظهرت بشكل خاص في الثمانينيات والتسعينيات من القرن الماضي لغات وظيفية جديدة (ML، Miranda، FP، SML، Haskell، Clean، ...) والتي كانت مختلفة تمامًا عن لهجات Lisp المعتادة.لا يزال هناك بعض التراث، ولكن في الغالب تطورت في اتجاهات مختلفة (الكتابة الثابتة، واستدلال النوع، وأنظمة الوحدات، واللغات المجمعة، وأنواع البيانات الجبرية، والتقييم البطيء، والنقاء، والمزيد).لا يزال لدى مجتمع Scheme الكثير من الاتصالات بمجتمع FP.ولكن هذا هو في الغالب.

هناك بعض أفكار FP الأساسية التي يمكن تعلمها بشكل مستقل عن لغة FP معينة، ولكن بشكل عام تختلف F# كثيرًا عن معظم لهجات Lisp.الميزة الأخرى، وهي أن F# يدعم النظام البيئي .net (خاصة أنه من إنشاء Microsoft) لا تدعمه لهجات Lisp بشكل جيد.

لا أتوقع أيضًا فائدة كبيرة من معرفة لهجة Lisp المقيدة مثل Emacs Lisp لتعلم F#.

نصائح أخرى

أعتقد أنه لا يوجد سوى "تداخل" صغير فيما ستتعلمه عبر Common Lisp مقابل F#.القاسم المشترك هو أنني أفكر تقريبًا

  • البرمجة باستخدام "قوائم السلبيات" كنوع بيانات أساسي شائع، وفي بعض الأحيان كتابة وظائف متكررة (خاصة العودية الخلفية) بدلاً من الحلقات
  • بعض الاستخدامات الأساسية للوظائف ذات الترتيب الأعلى الشائعة (على سبيل المثال:"خريطة" - تطبيق دالة على كل قيمة في القائمة)

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

بغض النظر عن الترتيب الذي تتعلمه، أعتقد أنه بعد تعلم أحدهما سيظل هناك الكثير لتتعلمه في الآخر (تعديل التداخل الصغير الذي وصفته أعلاه).

وF # هو الأكثر مماثلة لعائلة ML لغات، مثل SML وCAML. بناء الجملة وميزات تختلف عن اللثغة.

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

و، وأود أن أقول، تعلم لغة أكثر وظيفية بحتة قبل البدء F # سيكون وسيلة لالتقاط عادات البرمجة الوظيفية جيدة، لأنه إذا لم تقم بذلك، قد ينتهي بك F # رمز الأمر أكثر OO وأقل وظيفية، لأن هذا هو حيث كنت قادما من.

من وجهة نظري، هناك طريقتان لتعلم البرمجة الوظيفية:

  1. استخدم لغة وظيفية أكثر نقية مثل Lisp أو Haskell التي ستجبرك على الخروج من عقلية إجرائية على الفور ؛أو

  2. استخدم لغة وظيفية براغماتية مثل F# التي توفر أيضًا بنيات مألوفة وأقل وظيفية ، لمساعدتك على تخفيف طريقك إليها.

في كلتا الحالتين، سوف تحصل على المزيد من تجربة التعلم إذا كان بإمكانك القيام بشيء مفيد باللغة.يبدو أن لديك الدافع لـ Lisp (Emacs) وF# (.NET interop)، لذا سألقي نظرة على كليهما وأرى ما يلفت انتباهك.

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

هناك شيئان مهمان يجب مراعاتهما وهما:

  • تتم كتابة LISP ديناميكيًا بينما تتم كتابة F# بشكل ثابت.
  • يحتوي LISP على وحدات ماكرو مدمجة.F # لا.

على الرغم من أنهما يعتبران وظيفيين ويشتركان في العديد من الميزات المشتركة، إلا أنهما مختلفان أيضًا.من المؤكد أن تعلم LISP سيجعلك مبرمجًا أفضل لـ F# والعكس صحيح، ولكن لا يزال يتعين عليك تعلم خصوصيات كليهما حتى تكون قادرًا على أن تكون عمليًا فيهما.

لكي أتمكن من التفاعل مع .NET سأختار بالتأكيد F# ولكن من أجل جمال البرمجة سأحاول استخدام LISP أيضًا.

كلاهما لغتان وظيفيتان لكنهما مختلفتان تمامًا من الناحية النحوية.وهذا يعني أن الكثير من المفاهيم ستكون متشابهة وسيتعين عليك (كمطور إجرائي) أن تفعل نفس الانحناء الذهني لاستخدام أي منهما ولكنهما لغتان مختلفتان تمامًا.

F# مشتق من مل (والتي تعتبر بكل مشتقاتها لغة وظيفية غير نقية). اللثغة أقدم وتعتبر لغة وظيفية "خالصة".

نقاء اللغة الوظيفية موضوع رائع وأنصح بقراءته نقاء اللغة والوظائف القذرة والنظيفة لفهم المفهوم بشكل أفضل:

يتحدث الكثير من الناس عن اللغات الوظيفية "النقية" ، حيث يبدو أن "Pure" مرادف لـ "Good".هناك سنتان مرتبطان عادة بتعريف لغة وظيفية نقية:

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

وأنا جديدة فقط لF #، ولكن درست اللثغة قبل F # وأعتقد أنه كان مفيدا للغاية في مضمونها F # داخل كل إطار. NET وسلسلة من لغات البرمجة.

وكنت بحرارة ننصح بمراقبة ما لا يقل القليلة الأولى أشرطة الفيديو هنا:

http://groups.csail.mit. ايدو / ماك / فئات / 6.001 / أبيلسون-سوسمان المحاضرات /

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

ودلالات F # ومخطط متشابهة جدا مع استثناء لاحظت من الكتابة قوية.

وأيضا، برنامج صغير جدا، وليس لمعرفة ذلك!

وكما اللثغة لغة البرمجة هو خاص جدا في ذلك امتلاك الحق إلا انها ليست مماثلة لF # على الإطلاق إلا أن كلا منهما البرمجة الوظيفية الدعم. ليس هناك الكثير من بنيات لغة تحمل أكثر من اللثغة إلى F #. إذا كنت تريد أن تتعلم الذهاب ثغة لذلك. فإن فكرة البرمجة الوظيفية تحمل ما يزيد قليلا لا بناء الجملة. ثغة قديمة حقا، أواخر 50s. وقد تأثر العديد من اللغات به، وهناك عدد غير قليل من اللهجات.

وإذا كان لديك فقط تبحث عن لغة وظيفية خالصة للتعلم قبل F # أنا أقترح هاسكل. وقد هاسكل يتأثر تأثرا كبيرا ML و هي لغة انتقال جيدة لF # منذ F # هو مشتق من ML. يمكنك أن تبحث في كود هاسكل ومعرفة أنماط مماثلة في F # رمز.

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