我有一个范围类型定义为:
type 'a range = Full | Range of ('a * 'a)
Run Code Online (Sandbox Code Playgroud)
但是,我想将'a'限制为整数或浮点数或字符,而没有其他有效类型的'a.
Range(0,10) (* valid *)
Range(0.0, 10.0) (* valid *)
Range('a', 'z') (* valid *)
Range("string1", "string2") (* other types like this shouldn't type check *)
Run Code Online (Sandbox Code Playgroud)
我想我可以将我的类型定义更改为:
type sequential = S_int of int | S_float of float | S_char of char ;;
type range = Full | Range of (sequential * sequential);;
Run Code Online (Sandbox Code Playgroud)
但是,这将允许以下内容:
Range(S_int(0), S_float(10.0));; (* problem: mixes int and float *)
Run Code Online (Sandbox Code Playgroud)
...但我希望Range的两个组件都是相同的类型.
我想另一种方法是创建一个int_range类型,一个float_range类型和一个char_range类型,但我想知道是否还有另一种方法?
let undefined = ["string"; ""; "string"; "boolean";"";"innermost"]
Run Code Online (Sandbox Code Playgroud)
我有一个列表,我想编写一个函数,返回一个没有重复和空字符串列表的列表.例如,undefined上面的列表将返回:
["string"; "boolean"; "innermost"]
Run Code Online (Sandbox Code Playgroud)
我写这个函数它为我返回没有重复,但我怎么能添加测试空字符串的条件.
let rec uniquify = function
| [] -> []
| x::xs -> x :: uniquify (List.filter ((<>) x) xs)
Run Code Online (Sandbox Code Playgroud)
非常感谢你
我试图找出如何用其他对象参数化OCaml对象.具体来说,我希望能够创建一个link包含前向node对象和后向node对象的对象,我希望能够通过以下方式创建链接:
let link1 = new link node_behind node_ahead;;
Run Code Online (Sandbox Code Playgroud)