【发布时间】:2010-12-17 07:59:57
【问题描述】:
我最近一直在做一些 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 中是可行的吗(也许是类型类)?
【问题讨论】:
标签: haskell types functional-programming ocaml type-systems