Haskell эквивалент Boost.Fusion - PullRequest
10 голосов
/ 29 ноября 2011

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

Ответы [ 4 ]

10 голосов
/ 29 ноября 2011

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

4 голосов
/ 29 ноября 2011

Во-первых, слишком очевидный ответ заключается в том, что вы можете легко написать «карту типа-> значение», используя 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, это не похоже на то, что вы могли бы после. Кажется, он позволяет создавать код, работающий с произвольными структурами данных? Это то, что в Хаскеле известно как универсальное программирование "Scrap your Boilerplate". Подробности см. В paper или , но он позволяет вам писать код, который обрабатывает произвольные структуры данных и выбирает значения заданных типов.

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

3 голосов
/ 29 ноября 2011

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

1 голос
/ 29 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...