OCaml签名有多种类型

时间:2017-02-21 20:10:34

标签: ocaml functor

我想表示一些标量值(例如整数或字符串) 通过它的实际值或某个NA值,然后存储它们 在集合(例如列表)中。目的是处理缺失值。

为此,我实施了签名

module type Scalar = sig
    type t
    type v = Value of t | NA
end

现在我有一些包含Vector的多态Scalar类型。基本上,以下一些

module Make_vector(S: Scalar) = struct
    type t = S.v list

    ... rest of the functor ...
end

然而,我无法让它发挥作用。我想做点什么

module Int_vector = Make_vector(
    struct
        type t = int
    end
)

module Str_vector = Make_vector(
    struct
        type t = string
    end
)

... and so on for some types.

我还没有和OCaml一起工作过,所以也许这不是正确的方法。关于如何用sum类型实现这种多态标量的任何建议?

编译器始终响应以下消息:

The parameter cannot be eliminated in the result type. 
Please bind the argument to a module identifier.

之前,我曾尝试将Scalar作为总和类型实现但遇到了 由于巨大的match子句而实现某些功能时的复杂性问题。另一个(imo不太好)选项是使用option。这是一个更好的策略吗?

1 个答案:

答案 0 :(得分:0)

据我所知,你正在构造v作为你的仿函数的输入类型,但你真的希望它是一个输出类型。然后,当您应用仿函数时,您只提供t类型而不是v类型。我的建议是将v的定义移到Make_vector的实现中。