1

例如,

let x = ["a";"b";"c";"d"];;

let listp = if (x.isa(List)) then true else false;;

OCaml 中是否有类似“isa”的方法来断言变量是 List/Array/Tuple... 等等?

4

3 回答 3

4

OCaml 没有用于测试某物类型的构造。一个好的经验法则是类型要么是固定的,要么是完全未知的。在第一种情况下,无需测试。在第二种情况下,代码需要适用于所有可能的类型。

如果您习惯了其他语言,这比您预期的要好得多。这是零/一/无穷大规则的一个很好的应用。

请注意,定义包含您感兴趣的一组类型之一的类型没有问题:

type number = MyFloat of float | MyInt of int

这种类型的值看起来像:MyFloat 3.1MyInt 30281。实际上,您可以通过匹配构造函数来测试类型:

let is_int x = match x with MyFloat _ -> false | MyInt _ -> true

列表和数组也是如此,除了它们是参数化类型:

type 'a collection = MyArray of 'a array | MyList of 'a list


let is_list x = match x with MyArray _ -> false | MyList _ -> true

由于缺乏所谓的自省,您可以轻松地构造和解构具有丰富和表达类型的值,并且您可以放心,当您调用的函数不知道是什么时,它们不会弄乱一个值它的类型是。

于 2013-08-17T05:45:52.103 回答
1

你不能只match x with针对你的类型吗?例如,对于一个序列:

let listp = match x with | h::t -> true | _ -> false

对于一个元组,我不记得确切的语法,但类似match x with | (k,v) -> true

等等...

于 2013-08-19T18:58:37.737 回答
0

不是真的:所有东西都有一个与之关联的类型,所以要么它已经知道它是一个列表,要么它是多态的(如'a),在这种情况下,我们不能“允许”了解底层类型。在这种情况下执行任何特定于类型的操作都会强制对值的类型进行专门化。

于 2013-08-29T13:08:23.947 回答