{-# LANGUAGE DataKinds, ScopedTypeVariables, TypeOperators, TypeApplications #-} {-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-} import Data.Proxy import GHC.TypeLits import Test.Tasty import Test.Tasty.HUnit test1 :: forall n . KnownNat n => Proxy n -> Integer test1 _ = natVal (Proxy :: Proxy n) + natVal (Proxy :: Proxy (n+2)) test2 :: forall n . KnownNat n => Proxy n -> Integer test2 _ = natVal (Proxy :: Proxy (n*3)) test3 :: forall n m . (KnownNat n, KnownNat m) => Proxy n -> Proxy m -> Integer test3 _ _ = natVal (Proxy :: Proxy (n+m)) test4 :: forall n m . (KnownNat n, KnownNat m) => Proxy n -> Proxy m -> Integer test4 _ _ = natVal (Proxy :: Proxy (n*m)) test5 :: forall n m . (KnownNat n, KnownNat m) => Proxy n -> Proxy m -> Integer test5 _ _ = natVal (Proxy :: Proxy (n^m)) test6 :: forall n m . (KnownNat n, KnownNat m) => Proxy n -> Proxy m -> Integer test6 _ _ = natVal (Proxy :: Proxy ((n^m)+(n*m))) tests :: TestTree tests = testGroup "ghc-typelits-natnormalise" [ testGroup "Basic functionality" [ testCase "KnownNat 4 + KnownNat 6 ~ 10" $ show (test1 (Proxy @ 4)) @?= "10" , testCase "KnownNat 4 * KnownNat 3 ~ 12" $ show (test2 (Proxy @ 4)) @?= "12" , testCase "KnownNat 2 + KnownNat 7 ~ 9" $ show (test3 (Proxy @ 2) (Proxy @ 7)) @?= "9" , testCase "KnownNat 2 * KnownNat 7 ~ 14" $ show (test4 (Proxy @ 2) (Proxy @ 7)) @?= "14" , testCase "KnownNat 2 ^ KnownNat 7 ~ 128" $ show (test5 (Proxy @ 2) (Proxy @ 7)) @?= "128" , testCase "KnownNat 3 ^ KnownNat 7 ~ 128" $ show (test5 (Proxy @ 3) (Proxy @ 7)) @?= "2187" , testCase "(KnownNat 2 ^ KnownNat 7) + (KnownNat 2 * KnownNat 7) ~ 142" $ show (test6 (Proxy @ 2) (Proxy @ 7)) @?= "142" ] ] main :: IO () main = defaultMain tests