المنفذون في لغة كامل الموضوعية
-
11-07-2019 - |
سؤال
وأواجه قليلا من مشكلة مع 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)