You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
3.2KB

  1. {-# OPTIONS_GHC -fno-warn-missing-methods #-}
  2. {-# OPTIONS_GHC -Wno-simplifiable-class-constraints #-}
  3. {-# LANGUAGE MultiParamTypeClasses #-}
  4. {-# LANGUAGE FunctionalDependencies #-}
  5. {-# LANGUAGE FlexibleInstances #-}
  6. {-# LANGUAGE UndecidableInstances #-}
  7. class Solution n r | n -> r
  8. where solution :: n -> r
  9. instance (InitList n l, Map BoomOrNum' l r)
  10. => Solution n r where solution = nil
  11. data BoomOrNum'
  12. nil = undefined
  13. class EqNine d b | d -> b
  14. instance (Equal d (S (S (S (S (S (S (S (S (S Z))))))))) r)
  15. => EqNine d r
  16. class Inc l r | l -> r
  17. instance (Reverse Nil l nl, Inc' True nl nr, Reverse Nil nr r)
  18. => Inc l r
  19. class Inc1 b n r | b n -> r
  20. instance Inc1 True d Z
  21. instance (Add (S Z) d r)
  22. => Inc1 False d r
  23. class Inc' c l r | c l -> r
  24. instance Inc' False l l
  25. instance Inc' True Nil (Cons (S Z) Nil)
  26. instance (Inc1 nc x nx, EqNine x nc, Inc' nc xs r)
  27. => Inc' True (Cons x xs) (Cons nx r)
  28. class InitList' t n l a | t n l -> a
  29. instance InitList' Z n l (Cons n l)
  30. instance (Inc n nn, InitList' x nn (Cons n l) a)
  31. => InitList' (S x) n l a
  32. class InitList t l | t -> l
  33. instance (InitList' t (Cons Z Nil) Nil a, Reverse Nil a l)
  34. => InitList t l
  35. data Boom
  36. class EqualThree x r | x -> r
  37. instance (Equal x (S (S (S Z))) a)
  38. => EqualThree x a
  39. data EqualThree'
  40. class Apply f a r | f a -> r
  41. instance (EqualThree x r)
  42. => Apply EqualThree' x r
  43. instance (BoomOrNum x r)
  44. => Apply BoomOrNum' x r
  45. class Map f xs ys | f xs -> ys
  46. instance Map f Nil Nil
  47. instance (Apply f x y, Map f xs ys)
  48. => Map f (Cons x xs) (Cons y ys)
  49. class Boom' c n r | c n -> r
  50. instance Boom' True n Boom
  51. instance Boom' False n n
  52. class BoomOrNum n r | n -> r
  53. instance (Map EqualThree' n bs, AnyTrue bs a, Boom' a n r)
  54. => BoomOrNum n r
  55. data Nil
  56. data Cons x xs
  57. class First list x | list -> x
  58. instance First Nil Nil
  59. instance First (Cons x more) x
  60. class ListConcat a b c | a b -> c
  61. instance ListConcat Nil x x
  62. instance (ListConcat as bs cs)
  63. => ListConcat (Cons a as) bs (Cons a cs)
  64. class ListConcatAll ls l | ls -> l
  65. instance ListConcatAll Nil Nil
  66. instance (ListConcat chunk acc result,
  67. ListConcatAll rest acc)
  68. => ListConcatAll (Cons chunk rest) result
  69. class AnyTrue list t | list -> t
  70. instance AnyTrue Nil False
  71. instance AnyTrue (Cons True more) True
  72. instance (AnyTrue list t)
  73. => AnyTrue (Cons False list) t
  74. data True
  75. data False
  76. class Not b1 b | b1 -> b
  77. instance Not False True
  78. instance Not True False
  79. class Or b1 b2 b | b1 b2 -> b
  80. instance Or True True True
  81. instance Or True False True
  82. instance Or False True True
  83. instance Or False False False
  84. data Z
  85. data S n
  86. class Equal a b t | a b -> t
  87. instance Equal Z Z True
  88. instance Equal (S a) Z False
  89. instance Equal Z (S b) False
  90. instance (Equal a b t)
  91. => Equal (S a) (S b) t
  92. class LessThan a b t | a b -> t
  93. instance LessThan Z Z False
  94. instance LessThan (S x) Z False
  95. instance LessThan Z (S x) True
  96. instance (LessThan a b t)
  97. => LessThan (S a) (S b) t
  98. class Add x y z | x y -> z
  99. instance Add x Z x
  100. instance Add Z y y
  101. instance (Add (S x) y z)
  102. => Add x (S y) z
  103. class Multiply x y a z | x y a -> z
  104. instance Multiply Z y a a
  105. instance Multiply x Z a a
  106. instance (Add x a r, Multiply x y r z)
  107. => Multiply x (S y) a z
  108. class Reverse i l r | i l -> r
  109. instance Reverse i Nil i
  110. instance (Reverse (Cons x i) xs r)
  111. => Reverse i (Cons x xs) r