2013-08-26 3 views
6

Я видел, что в последних версиях GHC есть поддержка списков типов. Однако мне нужно работать с наборами типов типов для приложения и хотел бы реализовать библиотеку набора типов на основе списков типов. Но я не знаю, с чего начать :(Наборы уровней уровня в Haskell/Agda

Есть ли библиотека поддержки наборов типа уровня в Haskell

+0

Ну, различные библиотеки расширяемой записи предоставляют вам операции set-ish (объединение, проверка наличия метки в записи), даже если реализация не является деревом, как Data.Set. Просмотрите список или другие биты на этой странице. – aavogt

+0

Существует теперь [библиотека] (https://hackage.haskell.org/package/type-level-sets), которая предоставляет это. –

ответ

2

Вы можете использовать HSet свойство для HList-х из HList пакета:

{-# LANGUAGE FlexibleInstances #-} 

import Data.HList 

class (HList l, HSet l) => ThisIsSet l where 
    -- Here we have @[email protected] which is @[email protected] _and_ @[email protected] 
    test :: l 

-- This is ok: 

instance ThisIsSet HNil where 
    test = hNil 

-- And this: 

instance ThisIsSet (HCons HZero HNil) where 
    test = hCons hZero hNil 

-- And this (HZero != HSucc HZero): 

instance ThisIsSet (HCons HZero (HCons (HSucc HZero) HNil)) where 
    test = hCons hZero (hCons (hSucc hZero) hNil) 

-- This is an error since HSucc HZero == HSucc HZero: 

instance ThisIsSet (HCons (HSucc HZero) (HCons (HSucc HZero) HNil)) where 
    test = hCons (hSucc hZero) (hCons (hSucc hZero) hNil) 

для работы с другими типами вам нужно написать HEq экземпляры для них.

Смежные вопросы