Ocaml中带有参数的类型的数组

| 我要在Ocaml做家庭作业... 我的老师说我们必须使用以下两种类型:
type \'a zapis = Prazen | Zapis of string * \'a;;
type \'a asocpolje = \'a zapis array;;
我的问题是,当我创建一个数组时:
# let a = Array.make 5 Prazen;;
val a : \'_a zapis array = [|Prazen; Prazen; Prazen; Prazen; Prazen|]
我不知道可以在此数组中插入什么值...
a.(0)<-???
有人可以告诉我可以在此数组中插入哪个值吗?     
已邀请:
        在将任何内容添加到数组之前,类型尚未完全定义。这反映在为数组指示的类型中:
val a : \'_a zapis array = [|Prazen; Prazen; Prazen; Prazen; Prazen|]
如果仔细观察,您会发现作为类型参数给出的
\'a
已变成
\'_a
(请注意
_
)。此类型的意思是“某种类型,但我还不知道哪种类型”。与“ 4”相反,后者表示任何类型。 这意味着您现在可以插入任何种类的Zapis。完成此操作后,您只能插入该特殊类型的Zapis(在其他类型中,
\'_a
消失并被正确的类型替换)。 所以如果你这样做
a.(0) <- Zapis (\"z\", 10)
a
将变成
int zapis array
,并且从那时起仅接受整数。 如果您改为
a.(0) <- Zapis (\"z\",\"z\") 
之后它将变成
string zapis array
,仅接受字符串。     
           您能告诉我如何创建数组类型asocpolje吗?
\'a asocpolje
\'a zapis array
是同一类型。根据键入程序精确推断您的定义的方式,您将获得一个或另一个,但它们是完全相同的。
\'a asocpolje
只是
\'a zapis array
的别名,不是新类型。 您可以使用显式类型注释来帮助OCaml打印正确的类型信息:
let t : \'a asocpolje = Array.make ...
但是,我不鼓励这种做法。它的行为方式不是很明显(例如
\'a
的含义可能令人吃惊,它没有强制多态性),并且您实际上是想在不存在的地方(类型相同)有所作为。如果您真的想区分这两种类型,则应将
\'a asocpolje
定义为新的代数类型(仅一种情况):
type \'a zapis = Prazen | Zapis of string * \'a;;
type \'a asocpolje = Asocpolje of \'a zapis array;;

let t = Asocpolje (Array.make ...)
let get (Asocpolje t) n = t.(n)
    

要回复问题请先登录注册