OCaml带有多个类型的签名

3

我希望能够用实际值或某些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的使用还不是很熟悉,也许这不是正确的方法。您有关于如何实现带有总和类型的多态标量的任何建议吗?

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

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

之前,我曾试图将Scalar实现为和类型,但由于庞大的match语句而遇到了复杂性问题,无法实现一些功能。另一个(在我看来不太好的)选择是使用option。这是更好的策略吗?

2个回答

0
据我所见,您正在将v结构化为functor的输入类型,但实际上您希望它成为输出类型。然后,当您应用functor时,只提供类型t而不是v。我的建议是将v的定义移动到Make_vector的实现中。

0
你究竟想用模块/函子做什么?为什么简单的 '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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接