0

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

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

4

2 回答 2

2
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]
于 2016-10-23T23:08:25.013 回答
1

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

如果您想让表达式能够计算出两个(或更多不同类型)的值,那么这意味着您想要创建一个包含所有这些类型的新类型。回想一下,可以将类型与集合进行比较。所以,如果你想定义一个新的类型t,它可以包含类型t1和的值t2,那么你需要有一个联合。由于类型t1t2具有不同的属性,很自然,我们希望以后有能力区分它们,所以我们想让并集可区分。碰巧的是,OCaml 具有对可区分联合的内置支持 - 变体,例如,

type t = T1 of t1 | T2 of t2

此类型定义创建了一个新类型,即类型t1和的可区分联合t2。该定义自然地创建了投影和注入函数。要将 type 的值x注入t1type t,请使用T1 x(对应于xtype的值t2,请使用T2 x)。使用模式匹配将值y从 type投影tt1t2,例如match y with T1 -> ... | T2 -> ...

于 2016-10-24T13:38:17.423 回答