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