2011-06-01 47 views
8

我有一门功课练习OCaml中做参数的类型......阵列与OCaml中

我的老师说,我们必须使用这2种类型:

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)<-??? 

有人可以告诉我哪个值可以插入到这个数组中吗?

回答

11

在向阵列添加任何内容之前,类型未完全定义。如果你仔细观察,你会看到'a你给类型参数已成为'_a(注意_

val a : '_a zapis array = [|Prazen; Prazen; Prazen; Prazen; Prazen|]

:这反映在array所指定的类型。这种类型意味着“某种类型,但我不知道哪一种”。与'a相反,这意味着任何类型。

这意味着在这一点上你可以插入任何种类的Zapis。一旦你这样做了,你只能插入那种特殊类型的Zapis(在其他类型中,'_a会消失并被替换为正确的类型)。

所以,如果你

a.(0) <- Zapis ("z", 10) 

a将成为从那一刻int zapis array和只接受整数。

如果你这样做,而不是

a.(0) <- Zapis ("z","z") 

它会成为一个string zapis array只接受字符串之后。

+0

感谢这个...我真的需要它:) – Cevap 2011-06-01 09:43:20

+0

你能告诉我如何创建一个数组类型asocpolje? – Cevap 2011-06-01 09:44:01

5

你能告诉我如何创建一个数组类型asocpolje吗?

'a asocpolje'a zapis array相同类型。根据typer推断你的定义的方式,你会得到一个或另一个,但它们完全相同。 '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)