{-# LANGUAGE TemplateHaskell, ConstraintKinds #-} module Acme.NumberSystem where import GHC.TypeLits import Language.Haskell.TH type Less = (<=) -- | Define the less than relation for numbers up to a number using Template Haskell. -- | E.g. numberSystem 100 numberSystem :: Integer -> Q [Dec] numberSystem theBiggestNumber = return . concat $ map (\i -> map (\j -> InstanceD [] (AppT (AppT (ConT (''Less)) (LitT (NumTyLit i)) ) (LitT (NumTyLit j))) [] ) [i..theBiggestNumber]) [1..theBiggestNumber]