|
- {-# OPTIONS_GHC -fno-warn-missing-methods #-}
- {-# OPTIONS_GHC -Wno-simplifiable-class-constraints #-}
- {-# LANGUAGE MultiParamTypeClasses #-}
- {-# LANGUAGE FunctionalDependencies #-}
- {-# LANGUAGE FlexibleInstances #-}
- {-# LANGUAGE UndecidableInstances #-}
-
- class Solution n r | n -> r
- where solution :: n -> r
- instance (InitList n l, Map BoomOrNum' l r)
- => Solution n r where solution = nil
-
- data BoomOrNum'
-
- nil = undefined
-
- class EqNine d b | d -> b
- instance (Equal d (S (S (S (S (S (S (S (S (S Z))))))))) r)
- => EqNine d r
-
- class Inc l r | l -> r
- instance (Reverse Nil l nl, Inc' True nl nr, Reverse Nil nr r)
- => Inc l r
-
- class Inc1 b n r | b n -> r
- instance Inc1 True d Z
- instance (Add (S Z) d r)
- => Inc1 False d r
-
- class Inc' c l r | c l -> r
- instance Inc' False l l
- instance Inc' True Nil (Cons (S Z) Nil)
- instance (Inc1 nc x nx, EqNine x nc, Inc' nc xs r)
- => Inc' True (Cons x xs) (Cons nx r)
-
- class InitList' t n l a | t n l -> a
- instance InitList' Z n l (Cons n l)
- instance (Inc n nn, InitList' x nn (Cons n l) a)
- => InitList' (S x) n l a
-
- class InitList t l | t -> l
- instance (InitList' t (Cons Z Nil) Nil a, Reverse Nil a l)
- => InitList t l
-
- data Boom
-
- class EqualThree x r | x -> r
- instance (Equal x (S (S (S Z))) a)
- => EqualThree x a
-
- data EqualThree'
-
- class Apply f a r | f a -> r
- instance (EqualThree x r)
- => Apply EqualThree' x r
- instance (BoomOrNum x r)
- => Apply BoomOrNum' x r
-
- class Map f xs ys | f xs -> ys
- instance Map f Nil Nil
- instance (Apply f x y, Map f xs ys)
- => Map f (Cons x xs) (Cons y ys)
-
- class Boom' c n r | c n -> r
- instance Boom' True n Boom
- instance Boom' False n n
-
- class BoomOrNum n r | n -> r
- instance (Map EqualThree' n bs, AnyTrue bs a, Boom' a n r)
- => BoomOrNum n r
-
- class AnyTrue list t | list -> t
- instance AnyTrue Nil False
- instance AnyTrue (Cons True more) True
- instance (AnyTrue list t)
- => AnyTrue (Cons False list) t
-
- data Nil
- data Cons x xs
-
- data True
- data False
-
- data Z
- data S n
-
- class Equal a b t | a b -> t
- instance Equal Z Z True
- instance Equal (S a) Z False
- instance Equal Z (S b) False
- instance (Equal a b t)
- => Equal (S a) (S b) t
-
- class Add x y z | x y -> z
- instance Add x Z x
- instance Add Z y y
- instance (Add (S x) y z)
- => Add x (S y) z
-
- class Multiply x y a z | x y a -> z
- instance Multiply Z y a a
- instance Multiply x Z a a
- instance (Add x a r, Multiply x y r z)
- => Multiply x (S y) a z
-
- class Reverse i l r | i l -> r
- instance Reverse i Nil i
- instance (Reverse (Cons x i) xs r)
- => Reverse i (Cons x xs) r
|