例如,
let x = ["a";"b";"c";"d"];;
let listp = if (x.isa(List)) then true else false;;
在OCaml中是否有类似"isa“的方法来断言变量是列表/数组/元组……诸若此类?
发布于 2013-08-17 05:45:52
OCaml没有用于测试事物类型的构造。一个很好的经验法则是,类型要么是固定的,要么是完全未知的。在第一种情况下,不需要测试。在第二种情况下,代码需要适用于所有可能的类型。
如果您习惯了其他语言,这将比您预期的要好得多。这是zero/one/infinity rule的一个很好的应用程序。
请注意,定义一个包含您感兴趣的一组类型之一的类型是没有问题的:
type number = MyFloat of float | MyInt of int
此类型的值类似于:MyFloat 3.1
或MyInt 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-19 18:58:38
你就不能只用match x with
搜索你喜欢的类型吗?例如,对于一个序列:
let listp = match x with | h::t -> true | _ -> false
对于元组,我不记得确切的语法,但类似于match x with | (k,v) -> true
以此类推。
发布于 2013-08-29 13:08:24
实际上并非如此:所有东西都有一个与之关联的类型,所以要么它已经知道它是一个列表,要么它是多态的(比如'a
),在这种情况下,我们不被“允许”知道底层类型。在这种情况下,执行任何特定于类型的操作都会强制实现值类型的专门化。
https://stackoverflow.com/questions/18285205
复制