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
的实现。
答
你想要完全使用模块/函子吗?为什么简单'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
还没想过!现在它可以工作。谢谢 :) – teekay