gpt4 book ai didi

ocaml - 将 GADT 转换为幻像类型

转载 作者:行者123 更新时间:2023-12-04 12:06:53 24 4
gpt4 key购买 nike

我在 OCaml 中玩弄 GADT 和幻像类型。我知道 GADT 可以方便地描述某些类型的幻像类型——如果我错了,请纠正我。所以我决定尝试将使用 GADT 类型的程序转换为具有 ADT 和幻像类型的程序。

我从 this blog post 学习了一个 GADT 程序作为起点。这是一个小的 bool/int 表达式求值器,它的要点如下:

module GADT = struct
type _ value =
| Bool : bool -> bool value
| Int : int -> int value

type _ expr =
| Value : 'a value -> 'a expr
| If : bool expr * 'a expr * 'a expr -> 'a expr
| Eq : 'a expr * 'a expr -> bool expr
| Lt : int expr * int expr -> bool expr

let rec eval : type a. a expr -> a = function
| Value (Bool b) -> b
| Value (Int i) -> i
| If (b, l, r) -> if eval b then eval l else eval r
| Eq (a, b) -> eval a = eval b
| Lt (a,b) -> a < b
end

于是我开始把它转换成 ADT + phantom 类型如下:
module ADT = struct
type 'a value =
| Bool of bool
| Int of int

let _Bool b : bool value = Bool b
let _Int i : int value = Int i

type 'a expr =
| Value of 'a value
| If of bool expr * 'a expr * 'a expr
| Eq of 'a expr * 'a expr
| Lt of int expr * int expr

let _Value v : 'a expr = Value v
let _If (cond, cons, alt) : 'a expr = If (cond, cons, alt)
let _Eq (left, right) : bool expr = Eq (left, right)
let _Lt (left, right) : bool expr = Lt (left, right)

let rec eval : type a. a expr -> a = function
| Value (Bool b) -> b
| Value (Int i) -> i
| If (cond, cons, alt) -> if eval cond then eval cons else eval alt
| Eq (left, right) -> eval left = eval right
| Lt (left, right) -> left < right
end

您无法控制 ADT 构造函数的类型变量,所以我创建了自己的 _Bool , _Int等构造函数来强制必要的类型。

但是,我的 ADT模块不编译:
  let rec eval : type a. a expr -> a = function
| Value (Bool b) -> b
^
Error: This expression has type bool but an expression was expected of type a

在这一点上,我假设我的想法是有缺陷的,您不能以这种方式将 GADT 转换为 ADT。但是,我想听听对此主题更有经验的人。

最佳答案

如果没有 GADT,您将无法做到这一点,因为幻像类型不能作为编译器的见证,表达式具有特定类型,因为使用幻像类型您实际上可以执行以下操作:

let bool b : int value = Bool b;;
val bool : bool -> int value = <fun>

这就是为什么只有幻像类型是不够的,这就是为什么在 OCaml 中引入了 GADT。

关于ocaml - 将 GADT 转换为幻像类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30017971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com