2016-10-23 72 views
0

是否可以定义使用的变体(或别的东西),这将包含整数和功能的同时一个列表?我特别感兴趣的是在列表中混合函数和其他类型。变量和列表OCaml中

类似地,是否可以创建一个可以返回数字或函数的函数? 请尽可能给出两种情况的代码示例。

回答

1
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] 
+0

是怎么回事,肯定会令你的答案更有帮助的一点解释。 –

0

当然,两者在OCaml中是可能的。

如果你想有可能使一个表达式,以评估两个(或更多不同类型)的值,那么就意味着,要创建一个新的类型,其中将包括所有这些类型。回想一下,一个类型可以与一个集合进行比较。所以,如果你要定义一个新的类型t,可以包含t1类型和t2的值,那么你需要有一个工会。由于t1t2类型具有不同的属性,因此我们希望能够稍后区分它们是很自然的,因此我们希望使联盟能够进行区分。碰巧的是,这OCaml有一个内置的可识别联合支持 - 变种,例如,

type t = T1 of t1 | T2 of t2 

这种类型的定义创建一个新的类型,即类型t1t2可识别联合。该定义自然产生投影和注入功能。要将类型t1的值x注入类型t,请使用T1 x(对应t2类型的值x,使用T2 x)。使用模式匹配来投影来自t类型的值y要么t1t2,例如match y with T1 -> ... | T2 -> ...