我最近一直在做一些OCaml编程,以学习语言和熟悉函数式编程。最近,我开始想,我希望能够扩展现有的类型(内置,还是我自己的一个),例如:在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中是可行的吗(也许是类型类)?
的也许感兴趣:https://sites.google.com/site/ocamlopen/ – 2013-04-17 20:46:30