Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. {-# LANGUAGE DataKinds #-}
  2. {-# LANGUAGE FlexibleInstances #-}
  3. {-# LANGUAGE GADTs #-}
  4. {-# LANGUAGE TemplateHaskell #-}
  5. {-# LANGUAGE TypeFamilies #-}
  6.  
  7. module Hamberger where
  8.  
  9. import Hamburger.TH
  10.  
  11. -- | A kind of the topping, and types.
  12. data Topping = Space -- ^ Mean a space, it can be inserted some @Topping@
  13. | Cheese | Tomato | Meet | Ushi
  14.  
  15. -- |
  16. -- A type level function
  17. -- that maps @HamburgerT@ and @Topping@ to @HamburgerT@.
  18. --
  19. -- If @HamburgerC a b c d@ :: @HamburgerT@ of the domain has no space, or @Fail@ is specified to the domain,
  20. -- return @Fail@ type.
  21. type family AddTopping (h :: HamburgerT) (t :: Topping) :: HamburgerT where
  22. AddTopping (HamburgerC Space b c d) t = HamburgerC t b c d
  23. AddTopping (HamburgerC a Space c d) t = HamburgerC a t c d
  24. AddTopping (HamburgerC a b Space d) t = HamburgerC a b t d
  25. AddTopping (HamburgerC a b c Space) t = HamburgerC a b c t
  26. AddTopping _ _ = Fail
  27.  
  28. -- | A kind of the abstract hamburger
  29. data HamburgerT = HamburgerC Topping Topping Topping Topping -- ^ A type constructor of the abstract hamburger
  30. | Fail -- ^ Mean a fail of a mapping of @AddTopping@
  31.  
  32.  
  33. {- The dependent type -}
  34.  
  35. -- |
  36. -- A concrete of the hamburger
  37. -- (A type constructor for a type of @HamburgerT@ kind).
  38. data SHamburger (h :: HamburgerT) where
  39. Concrete :: STopping -> STopping -> STopping -> STopping -> SHamburger (HamburgerC a b c d :: HamburgerT)
  40.  
  41. -- | A singleton type for @Topping@ kind.
  42. data STopping = SSpace | SCheese | STomato | SMeet | SUshi
  43. deriving (Show)
  44.  
  45. -- | Represent the simply dependent type
  46. class Singleton (h :: HamburgerT) where
  47. sing :: SHamburger h
  48.  
  49.  
  50. -- Define any instances for 126 patterns !
  51. defineInstances
  52.  
  53.  
  54. type BasicHamburgerC = HamburgerC Space Space Space Space
  55.  
  56. type HamburgerC1 = AddTopping BasicHamburgerC Cheese -- these kind is @HamburgerT@
  57. type HamburgerC2 = AddTopping HamburgerC1 Tomato
  58. type HamburgerC3 = AddTopping HamburgerC2 Meet
  59. type HamburgerC4 = AddTopping HamburgerC3 Ushi
  60. type HamburgerC5 = AddTopping HamburgerC4 Ushi -- = Fail
  61.  
  62. x0 = sing :: SHamburger BasicHamburgerC
  63. x1 = sing :: SHamburger HamburgerC1
  64. x2 = sing :: SHamburger HamburgerC2
  65. x3 = sing :: SHamburger HamburgerC3
  66. x4 = sing :: SHamburger HamburgerC4
  67. --x5 = sing :: SHamburger HamburgerC5 -- This is the compile error because Refl is not a Fail's value
  68.  
  69.  
  70. main :: IO ()
  71. main = do
  72. print x0
  73. print x1
  74. print x2
  75. print x3
  76. print x4
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement