Advertisement
Guest User

Untitled

a guest
Oct 13th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.57 KB | None | 0 0
  1. {-# LANGUAGE GADTs, StandaloneDeriving, DataKinds #-}
  2. {-# LANGUAGE KindSignatures, PolyKinds, RankNTypes #-}
  3. {-# LANGUAGE TypeFamilies #-}
  4. {-# LANGUAGE TypeOperators #-}
  5.  
  6. module EffSystem
  7. where
  8.  
  9. import GHC.TypeLits (ErrorMessage(..),TypeError)
  10.  
  11. data Eff = EffWrite | EffRead
  12.  
  13. type EPure = '[]
  14. type EWrite = '[EffWrite]
  15. type ERead = '[EffRead]
  16.  
  17. data Test :: [Eff] -> * where
  18. A :: Test EPure -- No Effect
  19. B :: Test EWrite -- Write Effect
  20. HB :: Test e -> Test (FindE 'EffWrite e) -- Handle Write Effect
  21. C :: Test ERead -- Read Effect
  22. HC :: Test e -> Test (FindE 'EffRead e) -- Handle Read Effect
  23. (:>) :: Test a -> Test b -> Test (a ++ b) -- Concatenate Test Nodes
  24.  
  25. -- elem on type-level-list
  26. type family FindE (a :: Eff) (xs :: [Eff]) :: [Eff] where
  27. FindE e (e : ys) = ys
  28. FindE e (n : ys) = n : FindE e ys
  29. FindE e '[] = TypeError (Text "Effect not found!")
  30.  
  31. -- Concatenate Type-Level-List
  32. type family (++) (as :: [k]) (bs :: [k]) :: [k] where
  33. (++) a '[] = a
  34. (++) '[] b = b
  35. (++) (a ': as) (a ': bs) = a ': (as ++ bs)
  36. (++) (a ': as) bs = a ': (as ++ bs)
  37.  
  38. {-
  39. λ> :t A
  40. A :: Test EPure
  41.  
  42. λ> :t B
  43. B :: Test EWrite
  44.  
  45. λ> :t HB B
  46. HB B :: Test '[]
  47.  
  48. λ> :t C
  49. C :: Test ERead
  50.  
  51. λ> :t HC C
  52. HC C :: Test '[]
  53.  
  54. λ> :t A :> B :> C
  55. A :> B :> C :: Test '[ 'EffWrite, 'EffRead]
  56.  
  57. λ> :t HC (HB (A :> B :> C))
  58. HC (HB (A :> B :> C)) :: Test '[]
  59.  
  60. λ> HC A
  61. <interactive>:115:1: error:
  62. • Effect not found! <--- Custom Type Error! \o/
  63. • When checking the inferred type
  64. it :: Test (TypeError ...)
  65. -}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement