summaryrefslogtreecommitdiff
path: root/src/Data.hs
diff options
context:
space:
mode:
authorTom Smeding <tom@tomsmeding.com>2024-09-05 21:56:07 +0200
committerTom Smeding <tom@tomsmeding.com>2024-09-05 21:57:02 +0200
commit402d28014e1e95c1fa8706c3648519a89a9e0e0f (patch)
treedd8ebb50c9041054b5ecf8d687c234fe1a81e5bf /src/Data.hs
parent150236cd0a2ff3dd199b13fb47b3ab1955a00193 (diff)
A simple embedded frontend
Diffstat (limited to 'src/Data.hs')
-rw-r--r--src/Data.hs15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/Data.hs b/src/Data.hs
index eb6c033..840cb88 100644
--- a/src/Data.hs
+++ b/src/Data.hs
@@ -9,9 +9,15 @@
{-# LANGUAGE TypeOperators #-}
module Data where
+import Data.Type.Equality
+
import Lemmas (Append)
+data Dict c where
+ Dict :: c => Dict c
+
+
data SList f l where
SNil :: SList f '[]
SCons :: f a -> SList f l -> SList f (a : l)
@@ -42,6 +48,11 @@ data SNat n where
SS :: SNat n -> SNat (S n)
deriving instance Show (SNat n)
+instance TestEquality SNat where
+ testEquality SZ SZ = Just Refl
+ testEquality (SS n) (SS n') | Just Refl <- testEquality n n' = Just Refl
+ testEquality _ _ = Nothing
+
fromSNat :: SNat n -> Int
fromSNat SZ = 0
fromSNat (SS n) = succ (fromSNat n)
@@ -50,6 +61,10 @@ class KnownNat n where knownNat :: SNat n
instance KnownNat Z where knownNat = SZ
instance KnownNat n => KnownNat (S n) where knownNat = SS knownNat
+snatKnown :: SNat n -> Dict (KnownNat n)
+snatKnown SZ = Dict
+snatKnown (SS n) | Dict <- snatKnown n = Dict
+
data Vec n t where
VNil :: Vec Z t
(:<) :: t -> Vec n t -> Vec (S n) t