在OCaml中,如何预测变量是List?

时间:2013-08-17 04:45:59

标签: list ocaml predicate

例如,

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

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

在OCaml中有类似“isa”方法来预测变量是List / Array / Tuple ......等等吗?

3 个答案:

答案 0 :(得分:4)

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

如果你习惯了其他语言,这比你预期的好很多。这是zero/one/infinity rule的一个很好的应用。

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

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

由于缺乏所谓的内省,你得到的回报是,你可以轻松地构建和解构具有丰富和富有表现力的类型的价值观,并且你可以放心,你所称的功能在他们不做时不会弄乱价值。知道它的类型是什么。

答案 1 :(得分:1)

你能不能match x with特定于你的类型的东西?例如,对于序列:

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

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

依旧......

答案 2 :(得分:0)

不是真的:一切都有与之相关的类型,所以要么它已经知道它是一个列表,要么它是多态的(如'a),在这种情况下我们不会“被允许”知道它基础类型。在这种情况下执行任何类型特定的操作都会强制对值的类型进行特化。