相关疑难解决方法(0)

扩展OCaml中的现有类型

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

type bexp =
  And of bexp * bexp
| Or of bexp * bexp
| Xor of bexp * bexp
| Not of bexp;;
Run Code Online (Sandbox Code Playgroud)

现在让我们说我想在这种类型中添加一个Nop变体,但仅用于新类型 - 有点像继承.嘿,这些应该是代数数据类型,对吧?那么为什么不是这样的:

type nbexp = bexp | Nop nbexp ;;
Run Code Online (Sandbox Code Playgroud)

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

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

ocaml haskell types type-systems functional-programming

19
推荐指数
4
解决办法
1497
查看次数