Ocaml中的变体和列表

时间:2016-10-23 22:23:22

标签: list function ocaml strong-typing variants

是否可以使用同时包含整数和函数的变体(或其他)来定义列表?我特别感兴趣的是在列表中混合函数和其他类型。

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

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

当然,两者都可以在OCaml中使用。

如果要使表达式成为可能,要评估值为两个(或更多不同类型),则意味着您要创建一个包含所有这些类型的新类型。回想一下,可以将类型与集合进行比较。因此,如果要定义一个新类型t,它可以包含类型t1t2的值,那么您需要一个联合。由于类型t1t2具有不同的属性,因此我们希望能够在以后区分它们,因此我们希望区分联合。碰巧的是,OCaml内置了对受歧视联盟的支持 - 变体,例如

type t = T1 of t1 | T2 of t2

此类型定义创建一个新类型,即类型t1t2的区别联合。该定义自然地创建了投影和注入功能。要将x类型t1注入类型t,请使用T1 x(相应地为x类型的值t2,使用{ {1}})。使用模式匹配将值T2 xy类投影到tt1,例如t2