OCaml签名与多种类型

问题描述:

我想代表一些标量值(例如整数或字符串) 或者它的实际值或某些NA值,并稍后将它们存储在集合(例如列表)中 。目的是处理缺失的值。OCaml签名与多种类型

要做到这一点,我实现了一个签名

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

现在我心里有一个包含Scalar小号一些多态性Vector类型。基本上,以下一些

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工作过很多,所以也许这不是正确的方法。任何建议如何实现这种多态标量与和类型?

编译器总是与以下消息响应:

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

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

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

+0

还没想过!现在它可以工作。谢谢 :) – teekay

你想要完全使用模块/函子吗?为什么简单'a option list不够好?您可以在其上运行功能,例如

let rec count_missing ?acc:(acc=0) = function 
    | None::tail -> count_missing ~acc:(acc+1) tail 
    | _::tail -> count_missing ~acc tail 
    | [] -> acc ;; 


val count_missing : ?acc:int -> 'a option list -> int = <fun> 

count_missing [None; Some 1; None; Some 2] ;; 
- : int = 2 

count_missing [Some "foo"; None; Some "bar"] ;; 
- : int = 1