سؤال

أريد حقًا إنشاء علامة تصنيف في SML ، ويبدو أن هناك بالفعل هيكل لهذا في SML/NJ.

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

أعتقد أنه شيء من هذا القبيل:

val ht : string * int HashTable.hash_table = HashTable.mkTable();

???

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

المحلول

توقيع mkTable القيمة:

val mkTable : (('a -> word) * (('a * 'a) -> bool)) -> (int * exn)
      -> ('a,'b) hash_table
    (* Given a hashing function and an equality predicate, create a new table;
     * the int is a size hint and the exception is to be raised by find.
     *)

لذلك ، يجب أن تفعل شيئًا مثل:

val ht : (string, int) HashTable.hash_table =
    HashTable.mkTable (HashString.hashString, op=) (42, Fail "not found")

نصائح أخرى

أفترض أن الفكرة هي إنشاء سلاسل رسم خرائط الجدول إلى الأعداد الصحيحة. ثم تريد أن تكتب نوعه باسم (string, int) hash_table (نوع hash_table هو نوع مع معلمتين ، وكتب هكذا في مل).

لكنك تحتاج أيضًا إلى وظيفة تجزئة hash : string -> word ووظيفة المساواة eq : string * string -> bool على الأوتار لتوفيرها mkTable. بالنسبة لهذا الأخير ، يمكنك ببساطة استخدام op=, ، بالنسبة إلى الأول يمكنك استخدامه HashString.hashString من الوحدة النمطية المعنية.

لذا،

val ht : (string, int) HashTable.hash_table = HashTable.mkTable(HashString.hashString, op=)(17, Domain)

يجب أن تعمل.

ومع ذلك ، يجب أن أشير إلى أن جداول التجزئة تميل إلى الاستخدام المفرط بشكل كبير ، وفي أكثر الأحيان هي بنية البيانات الخاطئة. هذا صحيح بشكل خاص في البرمجة الوظيفية ، لأنها هيكل بيانات مفيد. عادة ما تكون أفضل حالًا (وربما أكثر كفاءة) باستخدام بعض الخريطة القائمة على الأشجار ، على سبيل المثال ، RedBlackMapFn من مكتبة SML/NJ.

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