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.

110 lines
2.5KB

  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. class AnyTrue list t | list -> t
  56. instance AnyTrue Nil False
  57. instance AnyTrue (Cons True more) True
  58. instance (AnyTrue list t)
  59. => AnyTrue (Cons False list) t
  60. data Nil
  61. data Cons x xs
  62. data True
  63. data False
  64. data Z
  65. data S n
  66. class Equal a b t | a b -> t
  67. instance Equal Z Z True
  68. instance Equal (S a) Z False
  69. instance Equal Z (S b) False
  70. instance (Equal a b t)
  71. => Equal (S a) (S b) t
  72. class Add x y z | x y -> z
  73. instance Add x Z x
  74. instance Add Z y y
  75. instance (Add (S x) y z)
  76. => Add x (S y) z
  77. class Multiply x y a z | x y a -> z
  78. instance Multiply Z y a a
  79. instance Multiply x Z a a
  80. instance (Add x a r, Multiply x y r z)
  81. => Multiply x (S y) a z
  82. class Reverse i l r | i l -> r
  83. instance Reverse i Nil i
  84. instance (Reverse (Cons x i) xs r)
  85. => Reverse i (Cons x xs) r