Возможно ли с помощью Haskell / GH C извлечь тип данных algebrai c, представляющий все типы с экземплярами Eq и Ord? Вероятно, для этого потребуются Generics, Typeable, et c.
Я бы хотел что-то вроде:
data Data_Eq_Ord = Data_String String
| Data_Int Int
| Data_Bool Bool
| ...
deriving (Eq, Ord)
Для всех типов, которые, как известно, имеют экземпляры для Eq и Ord. Если это упростит решение, мы можем ограничить нашу область действия экземплярами Ord, поскольку Eq подразумевается Ord. Но было бы интересно узнать, возможно ли пересечение ограничений.
Этот тип данных был бы полезен, потому что он дает возможность использовать его там, где требуются ограничения Eq и Ord, и сопоставление с образцом во время выполнения для уточнения types.
Мне это понадобится для реализации общего c Map Key Value, где Key будет этим типом, в библиотеке индексирования документов, где ключи и их тип известны во время выполнения. Эта библиотека здесь . На данный момент я обошел проблему, определив классы data DocIndexKey
и FieldKey
, но это не совсем удовлетворительно, поскольку для этого требуется шаблонный код и не могут быть охвачены все кандидаты в файлы git.
Приветствуется любой хороший альтернативный подход к этой ситуации. По некоторым причинам я предпочитаю избегать шаблона Haskell.