如何解决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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。