Мне нужно экспортировать некоторые перечисления из кода C++. https://github.com/horde3d/Horde3D/blob/master/Horde3D/Bindings/C%2B%2B/Horde3D.hEnum с начальным значением
struct H3DGeoRes
{
enum List
{
GeometryElem = 200,
//...
};
};
struct H3DAnimRes
{
enum List
{
EntityElem = 300,
//...
};
};
Как я могу написать это в Haskell? Могу ли я переопределить fromEnum для типа?
data H3DGeoRes = GeometryElem | ... deriving (Show, Eq, Ord, Bounded, Enum)
data H3DAnimRes = EntityElem | ... deriving (Show, Eq, Ord, Bounded, Enum)
-- not work
instance Enum H3DGeoRes where
fromEnum x = (fromEnum x) + 200
instance Enum H3DAnimRes where
fromEnum x = (fromEnum x) + 300
Да, вы абсолютно правы. Проблема в том, что вам придется писать 'fromEnum' путем сопоставления шаблонов, то есть' fromEnum GeometryElem = 200'. Текущий код бесконечно рекурсивный. Вы можете управлять шаблоном с использованием расширения Template Haskell для генерации этих экземпляров. –
Спасибо, http://codepad.org/JG6tFGWF это работает, но мне нужно много констант перечисления. Возможно, есть способы укоротить – Alexes
Взгляните на этот код. Это совершенно понятно. Насколько я знаю, нет более простого способа сделать это. http://www.haskell.org/haskellwiki/Template_haskell/Instance_deriving_example –