سؤال

وأواجه قليلا من مشكلة مع functor (وهذا نوع الناتج). أدناه، ولدي مجموعة functor يستخدم نوع أمر. كنت في الواقع set.ml التي تأتي مع لغة كامل الموضوعية لبعض التوجيه، ولكن يبدو لي أن تفعل كل شيء <م> ahhem الصحيح. أنا خلقت وحدة أمرت مع الأعداد الصحيحة وتطبيقها على مجموعة functor للحصول على وحدة الأخيرة على هذا نموذج التعليمات البرمجية، IntSet.

وفشل السطر التالي، عندما أحاول إدراج عدد صحيح. أحصل على الخطأ من النوع التالي:

Error: This expression has type int but is here used with type
         SetInt.elt = Set(OrdInt).elt

ولا تفهموني خطأ، ونظام النوع هو الصحيح هنا. تقارير المستوى الأعلى أن هذا النوع من SetInt.elt هو Set(OrdInt).elt، ولكن عندما أفعل نفس العمليات لإنشاء مجموعة باستخدام واحد التي تقدمها لغة كامل الموضوعية خط 'نفس' هو، SetInt.elt = OrderedInt.t. يبدو أنني يجب أن يكون الحصول على SetInt.elt = Ordered.t.

وهذا هو بسيط جدا، وأنا ربما فقط في عداد المفقودين بعض التفاصيل غبي! أرغ!

ويرجى ملاحظة: لقد تبسيط وظائف الأعضاء / إدراج هنا منذ هذه المسألة لا علاقة لها أنواع

.
module type Ordered =
  sig
    type t 
    val lt : t -> t -> bool
    val eq : t -> t -> bool
    val leq : t -> t -> bool
  end

module type S =
  sig
    type elt
    type t
    exception Already_Exists
    val empty  : t
    val insert : elt -> t -> t
    val member : elt -> t -> bool
  end

module Set (Elt:Ordered) : S = 
  struct
    type elt = Elt.t
    type t = Leaf | Node of t * elt * t
    exception Already_Exists
    let empty = Leaf
    let insert e t = t
    let member e t = false
  end

module OrdInt : Ordered =
  struct
    type t = int
    let lt a b = a < b
    let eq a b = a = b
    let leq a b = a <= b
  end

module IntSet = Set (OrdInt)

(* line that fails *)
let one_elm = IntSet.insert 1 IntSet.empty
هل كانت مفيدة؟

المحلول

وتحتاج إلى تغيير هذين الخطين

module Set (Elt:Ordered) : S = 
module OrdInt : Ordered =

إلى

module Set (Elt:Ordered) : S with type elt = Elt.t = 
module OrdInt : Ordered with type t = int =

ودون هذه، وحدات لن يكون التوقيعات التي تعرض أنواع ELT ور ك int.

[تحرير]: وset.ml ليس لديها 'مع' بعض الشيء، لأن هناك sml.mli، الذي يعلن توقيع لfunctor وأنها لا تملك 'مع'. أيضا، OrdInt لا يحتاج 'مع' إذا لم تقم بتحديد صراحة التوقيع لذلك، مثل هذا:

module OrdInt =

ويمكنك أيضا إنشاء مجموعة من خلال تحديد وحدة في المكان:

module IntSet = Set (struct
 type t = int
 let lt a b = a < b
 let eq a b = a = b
 let leq a b = a <= b
end) 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top