سؤال

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

أريد وسيلة سهلة لفهم FP اللغة لتوضيح DS المفاهيم التي يمكن للطلاب استخدامها.معظم الطلاب سوف يكون فقط واحد أو فصلين دراسيين في البرمجة جافا, في أحسن الأحوال.بعد النظر في المخطط ، إرلانج, هاسكل, Ocaml ، SML ، لقد استقر على إما هاسكل أو معيار مل.أنا أميل نحو هاسكل للأسباب المبينة أدناه ، ولكن أريد رأي أولئك الذين ينشطون المبرمجين في واحدة أو أخرى.

  • كل هاسكل و SML يكون نمط مطابقة مما يجعل وصف العودية خوارزمية حزام السرج.
  • هاسكل قائمة لطيفة comprehensions التي تتطابق بشكل جيد مع طريقة هذه القوائم يتم التعبير عنها رياضيا.
  • هاسكل كسول التقييم.كبيرة لبناء لانهائية القوائم باستخدام القائمة أسلوب الفهم.
  • SML لديه حقا التفاعلية مترجم في الوظائف التي يمكن أن تكون محددة واستخدامها.في هاسكل, وظائف يجب أن تكون محددة في ملف منفصل و جمعت قبل استخدامها في التفاعلية قذيفة.
  • SML يعطي تأكيدا صريحا من وظيفة الحجة والعودة أنواع في الجملة التي من السهل أن نفهم.على سبيل المثال:فال فو = fn :int * int -> int.هاسكل الضمني الكاري الجملة هو أكثر قليلا منفرجة ، ولكن ليس تماما الغريبة.على سبيل المثال:فو ::الباحث -> Int -> Int.
  • هاسكل يستخدم التعسفي-الدقة الأعداد الصحيحة بشكل افتراضي.إنه خارجي مكتبة في SML/NJ.و SML/NJ باقتطاع الإخراج إلى 70 حرفا بشكل افتراضي.
  • هاسكل امدا الجملة خفية -- ويستخدم واحد مائل.SML هو أكثر وضوحا.ليس متأكدا مما إذا كان سوف تحتاج من أي وقت مضى لامدا في هذه الفئة ، على الرغم من.

أساسا ، SML و هاسكل هي تقريبا ما يعادلها.أميل إلى هاسكل لأن أنا المحبة قائمة comprehensions لانهائية القوائم في هاسكل.ولكن انا قلق من أن عددا كبيرا من الرموز في هاسكل المدمجة الجملة قد تسبب مشاكل الطلاب.من ما كنت تجمع القراءة وظائف أخرى على ذلك ، هاسكل لا ينصح للمبتدئين تبدأ مع FP.ولكن لن يكون بناء كاملة من التطبيقات ، أجرب خوارزميات بسيطة.

ماذا تعتقد ؟


تحرير:عند قراءة بعض الردود رائعة يجب أن أوضح بعض النقاط.

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

fac 0 = 1
fac n = n * fac (n-1)

بالنسبة لي, هذا واضح, موجزة, و المباريات الرياضية تعريف في الكتاب.ولكن إذا كنت تريد أن تكتب وظيفة في GHCi مباشرة, يمكنك استخدام بناء الجملة:

let fac 0 = 1; fac n = n * fac (n-1)

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

من قبل "تأكيدا صريحا من وظيفة ،" قصدت أنه عند تحديد وظيفة ، SML على الفور يخبرك اسم الدالة على أنواع من الحجج و نوع الإرجاع.في هاسكل لديك لاستخدام :type الأمر ثم يمكنك الحصول على مربكة إلى حد ما الكاري التدوين.

واحد أكثر الشيء باردة حول هاسكل - - - هذه صالحة تعريف الدالة:

fac 0 = 1
fac (n+1) = (n+1) * fac n

مرة أخرى, هذه المباريات تعريف لأنها قد تجد في الكتاب المدرسي.لا يمكن أن نفعل ذلك في SML!

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

المحلول

كما أحب هاسكل هنا هي الأسباب يفضل SML لفئة في الرياضيات المنفصلة و هياكل البيانات (و معظم المبتدئين دروس):

  • الزمان والمكان تكاليف هاسكل البرامج يمكن أن يكون من الصعب جدا التنبؤ به ، حتى بالنسبة للخبراء.SML تقدم أكثر من ذلك بكثير محدودة الطرق لتفجير الجهاز.

  • بناء جملة الدالة defintion تفاعلي مترجم متطابقة إلى الجملة المستخدمة في ملف بحيث يمكنك قص ولصق.

  • على الرغم من أن عامل الحمولة الزائدة في SML هي وهمية تماما ، بل هو أيضا بسيطة.سيكون من الصعب تعليم فئة كاملة في هاسكل دون الحاجة إلى الدخول في نوع الطبقات.

  • يستطيع الطالب التصحيح باستخدام print.(وعلى الرغم من أن المعلق ، فإنه من الممكن الحصول على تقريبا نفس التأثير في هاسكل باستخدام Debug.Trace.trace.)

  • لانهائية هياكل البيانات ضربة عقول الناس.للمبتدئين, كنت أفضل حالا وجود لهم تحديد نوع دفق كاملة مع المرجع الخلايا thunks ، حتى أنها تعرف كيف يعمل:

    datatype 'a thunk_contents = UNEVALUATED of unit -> 'a
                               | VALUE of 'a
    type 'a thunk = 'a thunk_contents ref
    val delay : (unit -> 'a) -> 'a thunk
    val force : 'a thunk -> 'a
    

    الآن أنه ليس من السحر أي أكثر من ذلك ، يمكنك الذهاب من هنا إلى تيارات (لانهائية القوائم).

  • تخطيط ليست بسيطة كما في بيثون يمكن أن يكون مربكا.

هناك نوعان من الأماكن هاسكل لديها ميزة:

  • في جوهر هاسكل يمكنك كتابة دالة نوع التوقيع فقط قبل التعريف.هذا هو مفيدة للغاية للطلاب وغيرها من المبتدئين.ليس هناك طريقة جيدة للتعامل مع نوع التوقيعات في SML.

  • هاسكل أفضل ملموسة في بناء الجملة.هاسكل الجملة هو تحسن كبير على مل الجملة.كنت قد كتبت ملاحظة قصيرة حول متى يمكن استخدام الأقواس في مل البرنامج;وهذا يساعد قليلا.

وأخيرا ، هناك هو السيف الذي يقطع كل الطرق:

  • هاسكل رمز نقي بشكل افتراضي ، بحيث يتمكن الطلاب من غير المرجح أن تتعثر على نجس بنيات (IO الكائن الدقيق الاحادي الخلية الدولة الكائن الدقيق الاحادي الخلية) عن طريق الصدفة.ولكن وعلى نفس المنوال لا يمكنهم طباعة و إذا كنت تريد أن تفعل I/O ثم في minumum لديك لشرح do التدوين ، return هو مربكة.

وفي موضوع ذي صلة ، إليك بعض النصائح الخاصة بك الحال التحضير:لا نغفل وظيفية بحتة هياكل البيانات كريس Okasaki.حتى إذا لم يكن لديك الخاص بك الطلاب استخدامه ، بالتأكيد سوف ترغب في الحصول على نسخة.

نصائح أخرى

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

بعض المشاكل لاحظت أن الطلاب غالبا ما يكون:

  • مطابقة نمط يمكن أن تكون صعبة قليلا في البداية.الطلاب في البداية بعض المشاكل رؤية مدى قيمة البناء و نمط مطابقة ذات الصلة.لديهم أيضا بعض المشاكل التمييز بين تجريدات.لدينا التدريبات شملت كتابة المهام التي تبسط الحساب التعبير و بعض الطلاب صعوبة في رؤية الفرق بين المجرد التمثيل (على سبيل المثال ، Const 1) و الفوقية لغة التمثيل (1).

    وعلاوة على ذلك, إذا كان الطلاب هم من المفترض أن تكتب قائمة وظائف معالجة أنفسهم ، يجب الحرص على تبيان الفرق بين أنماط

    []
    [x]
    (x:xs)
    [x:xs]
    

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

  • لم نكن نعلمها لطلابنا عن وظائف مجهولة ، ونحن ببساطة قال لهم عن where البنود.بالنسبة لبعض المهام هذا كان مطول بعض الشيء ، ولكن عملت بشكل جيد على خلاف ذلك.نحن أيضا لم أخبرهم عن جزئية التطبيقات ؛ وربما هذا هو السهل جدا لشرح في هاسكل (بسبب شكله من أنواع الكتابة) لذلك قد يكون من المفيد عرض لهم.

  • فإنها سرعان ما اكتشف قائمة comprehensions و فضل لهم على الوظائف العليا مثل filter, map, zipWith.

  • أعتقد أننا غاب قليلا على تعليمهم كيفية السماح لهم دليل أفكارهم من أنواع.أنا لست متأكدا تماما, رغم أن, إذا كان هذا هو مفيدة للمبتدئين أو لا.

  • رسائل الخطأ عادة ما تكون غير مفيدة جدا للمبتدئين, قد تحتاج في بعض الأحيان إلى بعض المساعدة مع هذه.أنا لم أجربها بنفسي لكن هناك هاسكل مترجم تحديدا على القادمين الجدد ، وذلك أساسا عن طريق رسائل الخطأ أفضل: الهليوم

  • عن برامج صغيرة مثل مساحة ممكنة التسريبات لم تكن قضية.

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

راجع للشغل ،

# SML لديه حقا التفاعلية مترجم في الوظائف التي يمكن أن تكون كل المعرفة واستخدامها.في هاسكل ، وظائف يجب أن تكون محددة في ملف منفصل و جمعت قبل المستخدمة في التفاعلية قذيفة.

غير دقيقة.استخدام GHCi:

Prelude> let f x = x ^ 2
Prelude> f 7
49
Prelude> f 2
4

وهناك أيضا موارد جيدة هاسكل في التعليم على haskell.org edu.صفحة الخبرات من مختلف المعلمين. http://haskell.org/haskellwiki/Haskell_in_education

أخيرا, سوف تكون قادرة على تعليمهم متعددة النواة التوازي للمتعة فقط, إذا كنت تستخدم هاسكل :-)

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

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

أنا أيضا أختلف مع أي اقتراح هاسكل لا ينصح للمبتدئين تبدأ مع FP.انها بالتأكيد الانفجار الكبير نهج بطرق صارمة اللغات مع الطفرة لا, ولكن أعتقد أن هذا هو النهج السليم.

  • SML لديه حقا التفاعلية مترجم في الوظائف التي يمكن أن تكون محددة واستخدامها.في هاسكل, وظائف يجب أن تكون محددة في ملف منفصل و جمعت قبل استخدامها في التفاعلية قذيفة.

في حين العناق قد يكون هذا القيد ، GHCi لا:

$ ghci
GHCi, version 6.10.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> let hello name = "Hello, " ++ name
Prelude> hello "Barry"
"Hello, Barry"

هناك العديد من الأسباب أنا أفضل GHC(أنا) على العناق ، هذا هو مجرد واحد منهم.

  • SML يعطي تأكيدا صريحا من وظيفة الحجة والعودة أنواع في الجملة التي من السهل أن نفهم.على سبيل المثال:فال فو = fn :int * int -> int.هاسكل الضمني الكاري الجملة هو أكثر قليلا منفرجة ، ولكن ليس تماما الغريبة.على سبيل المثال:فو ::الباحث -> Int -> Int.

SML قد ما تسميه "ضمني كاري" بناء الجملة كذلك.

$ sml
Standard ML of New Jersey v110.69 [built: Fri Mar 13 16:02:47 2009]
- fun add x y = x + y;
val add = fn : int -> int -> int

أساسا ، SML و هاسكل هي تقريبا ما يعادلها.أميل إلى هاسكل لأن أنا المحبة قائمة comprehensions لانهائية القوائم في هاسكل.ولكن انا قلق من أن عددا كبيرا من الرموز في هاسكل المدمجة الجملة قد تسبب مشاكل الطلاب.من ما كنت تجمع القراءة وظائف أخرى على ذلك ، هاسكل لا ينصح للمبتدئين تبدأ مع FP.ولكن لن يكون بناء كاملة من التطبيقات ، أجرب خوارزميات بسيطة.

أنا أحب استخدام هاسكل أكثر بكثير من SML ، ولكن أود أن لا يزال تعليم SML الأولى.

  • إعارة nominolo أفكار قائمة comprehensions هل يبدو أن بطء الطلاب من الوصول إلى بعض الوظائف العليا.
  • إذا كنت تريد الكسل لانهائية القوائم انها مفيدة لتنفيذ ذلك صراحة.
  • لأن SML هو بفارغ الصبر تقييم تنفيذ النموذج هو الآن أسهل على الفهم ، و "التصحيح عبر printf" تعمل على نحو أفضل كثيرا مما كانت عليه في هاسكل.
  • SML هذا النوع هو أبسط.في حين أن الفئة الخاصة بك على الأرجح لن استخدامها على أي حال, هاسكل typeclasses لا تزال إضافية عثرة للحصول على أكثر من ذلك -- الحصول عليها لفهم 'a مقابل ''a التمييز في SML صعبة بما فيه الكفاية.

معظم الإجابات كانت التقنية ، ولكن أعتقد أن عليك أن تنظر في واحد على الأقل ليس هذا هو:هاسكل (كما OCaml), في هذا الوقت, وقد مجتمع أكبر استخدامه في مجموعة واسعة من السياقات.هناك أيضا قاعدة بيانات كبيرة من المكتبات و التطبيقات المكتوبة من أجل الربح والمتعة في Hackage.التي قد تكون عاملا هاما في الحفاظ على بعض الطلاب استخدام اللغة بعد الدورة النهائية, ربما في محاولة غيرها من اللغات الوظيفية (مثل معيار مل) في وقت لاحق.

أنا مندهش كنت لا تفكر في OCaml و F# نظرا لأنها تعالج الكثير من المخاوف الخاصة بك.بالتأكيد لائقة ومفيدة بيئات التطوير هي أولوية عالية للمتعلمين.SML هو الطريق وراء F# هو الطريق إلى الأمام من جميع FPLs في هذا الصدد.

أيضا ، على حد سواء OCaml و F# لديها قائمة comprehensions.

هاسكل.أنا متقدم في ألجوس/نظرية الطبقة في CS بسبب الاشياء تعلمت من استخدام هاسكل.إنه شامل اللغة, سوف يعلمك طن من CS ، فقط عن طريق استخدام.

ومع ذلك ، SML هو أسهل بكثير من تعلم.هاسكل لديها ميزات مثل كسول تقييم ومراقبة الهياكل التي تجعل من أقوى بكثير ، ولكن مع تكلفة حاد(العش) منحنى التعلم.SML لا يوجد لديه مثل هذا المنحنى.

قال أن معظم هاسكل كان نبذ الاشياء من أقل العلمي/الرياضيات لغات مثل روبي ، ObjC ، أو الثعبان.

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