هل لغات البرمجة الوظيفية جيدة للمهام العملية؟ [مغلق

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

سؤال

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

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

في الأساس ، المهام التي أسميها "عملية" مثل

Aceept a request, find and process requested data,
 and return it formatted as needed

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

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

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

المحلول

فيما يتعلق باللغات ، أعتقد أن f# مثال على اللغات التي تكون في المقام الأول "وظيفية" ولكنها أيضًا "عملية". من المحتمل أن يكون Scala و Clojure آخرين في هذه الفئة.

(الذهاب إلى مستوى واحد أعمق ، أعتقد أن "صيغة النجاح" هنا هي لغة تميل بقوة نحو "وظيفية" ، ولكن لديها إمكانية الوصول إلى المكتبات العملية الشاسعة (على سبيل المثال دعم IDE).).

أنا على الأقل أتفق إلى حد ما مع الفرضية الضمنية للسؤال ، أي أن هناك توترًا بين "القوة التحليلية المستقيمة/الجميلة" و "البراغماتية".

نصائح أخرى

هل لدى أي شخص أمثلة على اللغات الوظيفية الرائعة في أداء المهام العملية أو المهام العملية التي يتم تنفيذها بشكل أفضل من خلال اللغات الوظيفية؟

يعمل أعمالنا على رمز F# ، لكل شيء بدءًا من معاملات بطاقات الائتمان عبر الإنترنت إلى تحليلات الويب. تتكون تطبيقات LOB هذه من البرامج النصية الصغيرة التي تفعل كل ما يتطلب بسرعة وببساطة استخدام interop السلس والأتمتة للتطبيقات مثل Outlook و Excel.

يجعل أعمالنا معظم برامج بيع الأموال المكتوبة في F# تحل المشكلات العملية للعملاء من العديد من القطاعات من البرامج المضمنة للمعدات الطبية إلى مزودي خدمات الإنترنت البحري.

IMO ، المخطط هو الحد الأدنى من أن يكون عمليًا- يتم استخدامه في العديد من الدورات التدريبية للتدريس (انظر بنية وتفسير برامج الكمبيوتر). ومع ذلك ، فإن لغات LISP الحديثة مثل LISP المشتركة ، وخاصة clojure تكتسب أهمية. يتم استخدام Erlang من قبل العديد من الصناعات الكبيرة لتطبيقات التزامن العالي ، وأنا شخصياً لم أرها تستخدمها من قبل مبرمجي المستخدمين النهائيين. من ناحية أخرى ، تعد Haskell لغة حقيقية تمامًا ، وقد تم استخدامها لكتابة الكثير من البرامج الرائعة بما في ذلك:

  1. Xmonad هو مدير نافذة Window System System مكتوب بحتة في Haskell.
  2. Leksah ، IDE لـ Haskell مكتوبة في Haskell نفسها.
  3. Pugs ، أحد التطبيقات الرائدة في Perl 6 مكتوبة في Haskell.
  4. أخيرًا ، تم كتابة برنامج التحويل البرمجي لشركة Glasgow Haskell في Haskell.

مضحك ، أنت ولدي أفكار مختلفة تمامًا عن "المهام العملية". أنت تقول إنها:

Aceept طلب ، والعثور على البيانات المطلوبة ، وإعادتها منسقًا حسب الحاجة

هذا إلى حد كبير ما يتم إجراؤه لغة وظيفية: الوظائف التي تأخذ البيانات وإرجاع بيانات جديدة دون الحفاظ على أي حالة بين المكالمات (أي لا توجد آثار جانبية). هذا ما لديك هنا وهو يسمى أيضًا الأنابيب.

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

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

لذلك في الختام ، فإن الإجابة التي تطلبه هي نعم ، نعم ، فإن البرامج الوظيفية متروكة للمهمة. الجواب الذي تبحث عنه حقًا ، هو أنه أكثر تعقيدًا من ذلك.

هل سبق لك أن استخدمت LINQ؟

إذا كان الأمر كذلك ، تهانينا. لقد استخدمت لغة وظيفية في سياق عملي. هذا هو ما يدور حول التنمية الوظيفية.

ونعم ، F# مفيد جدًا.

تشتهر إرلانج بمتانتها وميزاتها لكتابة الخوادم عالية الاتصال.

كما أن لديها ملف DBMS خارج الصندوق.

في الأساس ، المهام التي أسميها "عملية" مثل

Aceept طلب ، والعثور على البيانات المطلوبة ، وإعادتها منسقًا حسب الحاجة

لقد جربت إرلانج ولم تستطع العثور على مهمة عملية لها بموجب هذا الوصف العملي؟

قبول الطلب.

تقصد مثل receive. أو مجرد استدعاء مستقيمة كدالة.

ابحث عن البيانات المطلوبة والمعالجة.

لست متأكدًا تمامًا مما تعنيه هنا ، ولكن للعثور على البيانات ، يوجد ملف I/O ، وشبكات I/O ، (موزعة) اتصال بين العمليات ، وما إلى ذلك. مطابقة الأنماط ، إلخ.

للمعالجة ، هناك مجموعة كاملة من الأشياء للسلاسل ، والقوائم ، والرياضيات ، والمجموعات ، والرسوم البيانية ، وما إلى ذلك ، أليس هذا كافيا للمعالجة؟ ماذا كنت تبحث عنه؟

أعدها منسقة حسب الحاجة.

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

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

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