Ocaml 中的变体和列表
Variants and lists in Ocaml
是否可以使用同时包含整数和函数的变体(或其他东西)来定义列表?我对在列表中混合函数和其他类型特别感兴趣。
类似地,是否可以创建一个可以 return 数字或函数的函数?
如果可能,请给出这两种情况的代码示例。
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
).使用模式匹配将值 y
从类型 t
投影到 t1
或 t2
,例如 match y with T1 -> ... | T2 -> ...
.
是否可以使用同时包含整数和函数的变体(或其他东西)来定义列表?我对在列表中混合函数和其他类型特别感兴趣。
类似地,是否可以创建一个可以 return 数字或函数的函数? 如果可能,请给出这两种情况的代码示例。
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
).使用模式匹配将值 y
从类型 t
投影到 t1
或 t2
,例如 match y with T1 -> ... | T2 -> ...
.