Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2021
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. {-# LANGUAGE AllowAmbiguousTypes, ConstraintKinds, FlexibleContexts, FlexibleInstances, GADTs, PolyKinds, RankNTypes, DataKinds, ScopedTypeVariables, TypeApplications, TypeFamilies, TypeOperators, OverloadedLabels #-}
  2. {-# LANGUAGE MultiParamTypeClasses #-}
  3. {-# LANGUAGE FunctionalDependencies #-}
  4. {-# LANGUAGE TypeFamilyDependencies #-}
  5.  
  6. import GHC.OverloadedLabels
  7. import GHC.TypeLits
  8.  
  9. data Assoc x v = x := v
  10.  
  11. data HList (ts :: [Assoc Symbol *]) where
  12. HNil :: HList '[]
  13. HCons :: forall a k ts. a -> HList ts -> HList (k := a : ts)
  14.  
  15. nil :: HList '[]
  16. nil = HNil
  17.  
  18. class FindElem x ts where
  19. findElem :: String
  20.  
  21. type family LookupType x ts where
  22. LookupType x ((x ':= v) : ts) = v
  23. LookupType x ((x' ':= v) : ts) = LookupType x ts
  24.  
  25. data Var (x :: Symbol) where
  26. Var :: KnownSymbol x => Var x
  27.  
  28. instance (KnownSymbol x, x ~ x') => IsLabel x (Var x') where
  29. fromLabel = Var
  30.  
  31. instance {-# OVERLAPPING #-} FindElem x '[x ':= v] where
  32. findElem = "a"
  33. -- instance {-# OVERLAPPING #-} FindElem x ((x ':= v) ': ts) where
  34. -- findElem = "b"
  35. -- instance {-# OVERLAPPING #-} FindElem x ts => FindElem x (xv ': ts) where
  36. -- findElem = "c"
  37. instance {-# INCOHERENT #-} FindElem x ts => FindElem x ts where
  38. findElem = "d"
  39.  
  40. get :: forall x ts. FindElem x ts => Var x -> HList ts -> String
  41. get _ _ = findElem @x @ts
  42.  
  43. env :: HList '["r" ':= Integer]
  44. env = HCons 5 HNil
  45.  
  46. f :: String
  47. f = findElem @"r" @'["r" ':= Integer]
  48.  
  49. g :: String
  50. g = get #r env
  51.  
  52.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement