是否可以定义使用的变体(或别的东西),这将包含整数和功能的同时一个列表?我特别感兴趣的是在列表中混合函数和其他类型。变量和列表OCaml中
类似地,是否可以创建一个可以返回数字或函数的函数? 请尽可能给出两种情况的代码示例。
是否可以定义使用的变体(或别的东西),这将包含整数和功能的同时一个列表?我特别感兴趣的是在列表中混合函数和其他类型。变量和列表OCaml中
类似地,是否可以创建一个可以返回数字或函数的函数? 请尽可能给出两种情况的代码示例。
type my_elt =
| Null
| Int of int
| Fun1 of (int-> unit)
| Fun2 of (int-> int)
let eval a =function
| Fun1 f -> f a;Null
| Fun2 f -> Int (f a)
| _ -> Null
let leval a l = List.map (fun elt -> eval a elt) l
;;
测试:
let l=[Int 2;Fun1 (Printf.printf "%d");Fun2 ((+)2) ]
# leval 2 l;;
2- : my_elt list = [Null; Null; Int 4]
当然,两者在OCaml中是可能的。
如果你想有可能使一个表达式,以评估两个(或更多不同类型)的值,那么就意味着,要创建一个新的类型,其中将包括所有这些类型。回想一下,一个类型可以与一个集合进行比较。所以,如果你要定义一个新的类型t
,可以包含t1
类型和t2
的值,那么你需要有一个工会。由于t1
和t2
类型具有不同的属性,因此我们希望能够稍后区分它们是很自然的,因此我们希望使联盟能够进行区分。碰巧的是,这OCaml有一个内置的可识别联合支持 - 变种,例如,
type t = T1 of t1 | T2 of t2
这种类型的定义创建一个新的类型,即类型t1
和t2
可识别联合。该定义自然产生投影和注入功能。要将类型t1
的值x
注入类型t
,请使用T1 x
(对应t2
类型的值x
,使用T2 x
)。使用模式匹配来投影来自t
类型的值y
要么t1
或t2
,例如match y with T1 -> ... | T2 -> ...
。
是怎么回事,肯定会令你的答案更有帮助的一点解释。 –