Ocaml的玩家

时间:2009-03-12 21:14:48

标签: functional-programming ocaml functor

我对仿函数有点问题(而且它是结果类型)。下面,我有一个使用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

1 个答案:

答案 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)