具有多种类型的OCaml签名

具有多种类型的OCaml签名,ocaml,functor,Ocaml,Functor,我想表示一些标量值(例如整数或字符串) 通过它的实际值或通过一些NA值,然后存储它们 在集合中(例如列表)。其目的是处理缺少的值 为此,我实现了一个签名 module type Scalar = sig type t type v = Value of t | NA end 现在我想到了一些多态的向量类型,它包含标量s。基本上,以下几点 module Make_vector(S: Scalar) = struct type t = S.v list ... r

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

为此,我实现了一个签名

module type Scalar = sig
    type t
    type v = Value of t | NA
end
现在我想到了一些多态的
向量
类型,它包含
标量
s。基本上,以下几点

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.
以前,我尝试将
标量
实现为求和类型,但遇到了一些问题
由于大量的
match
子句,实现某些功能时会出现复杂性问题。另一个(我不太喜欢)选项是使用
选项
。这是一个更好的策略吗?

据我所知,您正在将
v
构造为functor的输入类型,但您确实希望它是一个输出类型。然后应用函子时,只提供类型
t
,而不提供类型
v
。我的建议是将
v
的定义移动到
Make_vector
的实现中你到底想用模块/函子做什么?为什么简单的选项列表不够好?您可以在其上运行函数,例如

let rec count\u缺失?acc:(acc=0)=函数
|无::尾部->计数\缺失~acc:(acc+1)尾部
|_u::tail->count_缺失~acc tail
|[]->acc;;
val count_缺失:?acc:int->“a选项列表->int=
缺少计数[无;某些1;无;某些2];;
-:int=2
缺少计数[一些“foo”;没有;一些“bar”];;
-:int=1