OCaml中的参数化类型

时间:2014-02-13 09:34:27

标签: ocaml parameterized-constructor

我已经搜索了一段时间,但我找不到解决方案。这可能是一个我无法弄清楚的简单语法问题。

我有一个类型:

# type ('a, 'b) mytype = 'a * 'b;;

我想创建一个string string sum类型的变量。

# let (x:string string mytype) = ("v", "m");;
Error: The type constructor mytype expects 2 argument(s),
   but is here applied to 1 argument(s)

我尝试过将括号括在类型参数周围的不同方法,我得到了几乎相同的错误。

然而,它适用于单个参数类型,所以我猜有一些我不知道的语法。

# type 'a mytype2 = string * 'a;;
# let (x:string mytype2) = ("hola", "hello");;
val x : string mytype2 = ("hola", "hello")

有人可以用两个参数告诉我如何做到这一点吗?

2 个答案:

答案 0 :(得分:3)

你应该写

let (x: (string, string) mytype) = ("v", "m");;

那是mytype参数是一对。您甚至可以删除不需要的括号:

let x: (string, string) mytype = "v", "m";;

答案 1 :(得分:1)

值得注意的是,您的类型mytype只是一对的同义词,因为它没有任何构造函数。所以你可以说let x = ("v", "m")

$ ocaml
        OCaml version 4.01.0

# type ('a, 'b) mytype = 'a * 'b;;
type ('a, 'b) mytype = 'a * 'b
# let x = ("v", "m");;
val x : string * string = ("v", "m")
# (x : (string, string) mytype);;
- : (string, string) mytype = ("v", "m")

关键是两种类型string * string(string, string) mytype属于同一类型。