我对仿函数有点问题(而且它是结果类型)。下面,我有一个使用Ordered类型的Set仿函数。我实际上使用了ocaml附带的set.ml
作为一些指导,但我似乎正在做一切 ahhem 。我创建了一个带有整数的Ordered模块,并将其应用于Set仿函数,以获取此代码示例IntSet的最后一个模块。
当我尝试插入一个整数时,下一行失败。我收到以下类型错误:
Error: This expression has type int but is here used with type
SetInt.elt = Set(OrdInt).elt
别误会我的意思,类型系统在这里是正确的。顶级报告SetInt.elt
的类型为Set(OrdInt).elt
,但当我使用ocaml提供的相同操作设置Set时,'same'行为{{1} }。好像我应该得到SetInt.elt = OrderedInt.t
。
这很简单,我可能只是错过了一些愚蠢的细节!哎呀!
请注意:我已经简化了成员/插入函数,因为这个问题与类型有关。
SetInt.elt = Ordered.t
答案 0 :(得分:14)
您需要更改这两行
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和t类型公开为int的签名。
[编辑]: set.ml没有'with'位,因为有一个sml.mli,它声明了仿函数的签名,它确实有'with'。此外,如果你没有为它明确指定签名,OrdInt不需要'with',如下所示:
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)