В последнее время я занимаюсь программированием 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 (возможно, с помощью моделей)?