[Haskell-cafe] Need help with advanced type-level programming
Evgeny Permyakov
permeakra at gmail.com
Fri Apr 24 13:35:28 UTC 2020
Consider following code
data Tag :: (Symbol -> Constraint) -> Symbol -> * where
Tag :: (KnownSymbol s, con s) => Tag con s
data TagList :: (Symbol -> Constraint) -> [Symbol] -> * where
LNil :: TagList con '[]
LCon :: Tag con s -> TagList con ss -> TagList con (s ': ss)
data TagSet :: (Symbol -> Constraint ) -> [Symbol] -> * where
SNil :: TagSet con '[]
SSin :: Tag con s -> TagSet con '[s]
SCon :: CmpSymbol ht mt ~ LT => Tag con ht -> TagSet con (mt ': ts) ->
TagSet con (ht ': mt ': ts)
How one would write a function converting a TagList into a TagSet ,
dropping duplicate tags ? I tried a few approaches, but failed. I clearly
lack understanding how to fit it into GHC type system. I know there is a
library type-level-sets, but it isn't what I would like and I don't
understand how it fits into GHC type system, so it appears to be magical to
me.
Similarly, it would be greatly appreciated if someone could show how to
implement following typeclass
class CmpTag (s1 :: Symbol) (s2 :: Symbol) where
cmpTag :: Tag con s1 -> Tag con s2 -> OrdTag con (CmpSymbol s1 s2) s1 s2
data OrdTag :: (Symbol -> Constraint) -> Ordering -> Symbol -> Symbol -> *
where
TLT :: CmpSymbol s1 s2 ~ LT => Tag con s1 -> Tag con s2 ->
OrdTag con LT s1 s2
TEQ :: (CmpSymbol s1 s2 ~ EQ, s1 ~ s2) => Tag con s -> Tag con s2 ->
OrdTag con EQ s1 s2
TGT :: CmpSymbol s1 s2 ~ GT => Tag con s1 -> Tag con s2 ->
OrdTag con GT s1 s2
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20200424/6266227a/attachment.html>
More information about the Haskell-Cafe
mailing list