Для меня понятие алгебраических типов данных Haskell всегда было похоже на полиморфизм на языках OO как C#.
Взгляд на пример от http://en.wikipedia.org/wiki/Algebraic_data_types :
data Tree = Empty
| Leaf Int
| Node Tree Tree
Это могло быть реализовано в C# как базовый класс TreeNode с полученным Листовым классом и полученным классом TreeNodeWithChildren, и если Вы хотите даже полученный класс EmptyNode.
(хорошо я знаю, никто никогда не делал бы это, но по крайней мере Вы могли сделать это.)
Невозможность использования оператора is - известная проблема, но есть довольно простая обходной путь.
if TObject(Element) is TInt then
List.AddElement(TInt.Create(XXX))
Кроме того, поскольку тип универсального кода является частью класса и известен во время компиляции, вам может быть лучше реструктурировать свой код. Создайте два разных универсальных класса, один из которых принимает TInt в качестве параметра
, а другой принимает TString. Поместите в них специфические для типа функциональные возможности на этом уровне и сделайте так, чтобы они происходили от общего предка для общих функциональных возможностей.
Этот вопрос, который я задал некоторое время назад
Условное поведение на основе конкретного типа для универсального класса
может представлять интерес, особенно если вы хотите использовать не только TObject
потомков, но также и примитивные типы в ваших условных выражениях.