سؤال

في Python، تعمل الخريطة () على أي بيانات تتبع بروتوكول التسلسل.إنه يفعل الشيء الصحيح ^ TM سواء أطعمته سلسلة أو قائمة أو حتى صفًا.

ألا يمكنني الحصول على كعكتي في OCaml أيضًا؟هل ليس لدي خيار آخر سوى النظر إلى نوع المجموعة الذي أستخدمه والعثور على List.map أو Array.map أو Buffer.map أو String.map المطابق؟بعض هذه لا وجود لها حتى!هل ما أطلبه غير عادي؟يجب أن أفتقد شيئًا ما.

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

المحلول

والأقرب ستحصل على هذا هو وحدة <وأ href = "http://batteries.forge.ocamlcore.org/doc.preview/batteries-alpha1/batteries/html/api/Data.Mutable.Enum. وشملت أتش تي أم أل "يختلط =" noreferrer "> Enum في بطاريات لغة كامل الموضوعية (سابقا <ل أ href = "http://ocaml-extlib.googlecode.com/" يختلط = "noreferrer"> Extlib ). تعرف Enum الخرائط وتطوي على Enum.t. لديك فقط لاستخدام التحويل إلى / من Enum.t لنوع البيانات الخاصة بك. التحويلات يمكن أن يكون إلى حد ما خفيفة الوزن، وذلك لأن Enum.t غير كسول.

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

نصائح أخرى

هناك حلان رئيسيان في OCaml:

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

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

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

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

وطالما قمت بتعريف ر نوع وفال مقارنة (: تي> تي> كثافة العمليات) في الوحدة النمطية الخاصة بك، Map.Make سوف تعطيك الخريطة التي تريدها.

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