ocaml如何使用具体类型测试模块

时间:2018-09-21 00:44:19

标签: inheritance module ocaml

给出以下界面:

module type Comparable = sig
    type t
    val compare : t -> t -> int
end

执行:

open Comparable

module Point : Comparable = struct
    type t = {x: float; y: float}

    let compare p1 p2 = 
        match (p1, p2) with
        | {x = x1; _}, {x = x2; _} -> int_of_float (x1 -. x2)
end

我将如何测试Point?或推荐的方法是什么?

我尝试过:

let () =
    (Printf.printf "%d\n" (Point.compare {x = 1.2; y = 3.4} {x = 3.5; y = 2.1}));
    ()

但是在我的IDE中出现此错误:

Error: Unbound record field x

如何做到这一点,以便我可以使用模块内定义的类型,而不必求助于在模块外部公开该类型?

我正在考虑某种create_from方法,该方法采用对象类型并返回正确的类型。

谢谢

1 个答案:

答案 0 :(得分:0)

这里的主要问题是,您使用Comparable签名无意中降低了模块的类型精度。

该签名将type t = {x: float; y: float}覆盖为type t,这就是为什么您获得

Error: Unbound record field x

一种解决方案是简单地忽略签名,然后让OCaml自己找出签名

module Point = struct
    type t = {x: float; y: float}

    let compare p1 p2 = 
        match (p1, p2) with
        | {x = x1; _}, {x = x2; _} -> int_of_float (x1 -. x2)
end

那你就可以做

Point.compare {x = 1.2; y = 3.4} {x = 3.5; y = 2.1}

没有任何错误,但是您会 收到警告,指出记录类型字段在当前范围中不可见-您可以通过指定记录的类型来解决此问题:

Point.compare {Point. x = 1.2; y = 3.4} {Point. x = 3.5; y = 2.1}