gpt4 book ai didi

haskell - 在 OCaml 中扩展现有类型

转载 作者:行者123 更新时间:2023-12-03 12:39:33 25 4
gpt4 key购买 nike

我最近一直在做一些 OCaml 编程来学习该语言并更加熟悉函数式编程。最近,我开始认为我希望能够扩展现有类型(内置或我自己的类型),例如:

type bexp =
And of bexp * bexp
| Or of bexp * bexp
| Xor of bexp * bexp
| Not of bexp;;

现在假设我想为这种类型添加一个 Nop 变体,但仅用于新类型 - 有点像继承。嘿,这些应该是代数数据类型,对吧?那么为什么不这样:
type nbexp = bexp | Nop nbexp ;;

...但这不是有效的 OCaml,它会给出语法错误。基本上,我想做的是说我希望 nbexp 包含 bexp 包含的所有内容,并在其中添加一个 Nop。我想这是不可能的,因为例如,如果您使用 And 构造函数,则无法确定它是 bexp 类型还是 nbexp 类型。 (我认为构造函数 Nop 采用 nbexp 也可能有问题。)

那么有没有办法在 OCaml 中做这样的事情呢?而且,这在 Haskell 中是可行的吗(也许是类型类)?

最佳答案

一个有趣的解决方案是使用多态变体:

type bexp =
[ `And of bexp * bexp
| `Or of bexp * bexp
| `Xor of bexp * bexp
| `Not of bexp ];;

type nbexp = [ bexp | `Nop of nbexp ];;

请注意,多态变体比普通变体更棘手,但允许类型扩展。

可以在 ocaml 源的测试目录中找到一个有趣的表达式评估示例,带有扩展名,使用多态变体,请参阅 svn

关于haskell - 在 OCaml 中扩展现有类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1746743/

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