Haskell эквивалент Boost.Fusion

Я играл с созданием полностью типизированной DSEL в Haskell с использованием GADT и, например, для полностью безопасного типа AST, и кажется, что для выполнения правильно типизированного компилятора требуются такие конструкции, как карты из типов Haskell для обоих типов и значений ( типизированные среды) и такие, которые могут быть поняты системой типа Haskell. С++ имеет библиотеку Boost.Fusion с такими конструкциями (карты типов типов, векторы типизированных значений и т.д.). Data.Tuple заботится о последовательностях, но существуют ли версии Haskell таких вещей, как Boost.Fusion map s?

Ответ 1

Посмотрите на dependent-map. Я не использовал его сам, но, похоже, он делает то, о чем вы просите. Если вам действительно нужно использовать равенство типа (и типа), вам может потребоваться согласовать значение по умолчанию или вместо этого использовать TypeRep.

Ответ 2

Во-первых, слишком очевидный ответ заключается в том, что вы можете легко написать "карту значений типа", используя Typeable (часть базовой библиотеки):

import Data.Typeable
import Data.Map

type TypeMap a = Map TypeRep a

insertT :: Typeable k => k -> a -> Map k a -> Map k a
insertT v = insert (typeOf k)

lookupT :: Typeable k => k -> a -> Map k a -> Map k a
lookupT v = lookup (typeOf k)

Теперь вы можете использовать код типа insertT (undefined :: Int) 5 для вставки элементов по типу.

Но, смотря на Fusion, на самом деле это не похоже на то, что вам нужно. Кажется, он позволяет вам создавать код, работающий на произвольных структурах данных? Это то, что в Haskell известно как универсальное программирование "Scrap your Boilerplate". Подробнее см. papers или hackage, но он позволяет вам писать код, который обрабатывает произвольные структуры данных и выбирает значения заданных типов.

Несколько других вещей, которые я видел в Fusion, возможно, можно эмулировать с помощью таких библиотек, как HList или, возможно, fclabels. Но действительно трудно сказать больше, не глядя на то, что вам действительно нужно.

Ответ 3

Как уже упоминалось ранее, dependent-map кажется правильным выбором для карты, но я бы рекомендовал посмотреть HArray интерфейса hlist в качестве альтернативы ручным манипуляциям с кортежами.

Ответ 4

Вы ищете Data.Map и списки? (например, [Int]).