Skip to content

Instantly share code, notes, and snippets.

@monadplus
Created January 30, 2020 21:58
Show Gist options
  • Save monadplus/f3197502a4ca4dcbc99e2d4ac9044558 to your computer and use it in GitHub Desktop.
Save monadplus/f3197502a4ca4dcbc99e2d4ac9044558 to your computer and use it in GitHub Desktop.
TODO improve this solution
data Vector (n :: Nat) (a :: Type) where
VNil :: Vector 'Z a
VCons :: a -> Vector n a -> Vector ('S n) a
data SmallerThan (limit :: Nat) where
SmallerThanZ :: SmallerThan ('S 'Z)
SmallerThanN :: SmallerThan n -> SmallerThan ('S n)
(!!!) :: Vector n a -> SmallerThan n -> a
(!!!) (VCons a _) SmallerThanZ = a
(!!!) (VCons _ v) (SmallerThanN n) = v !!! n
-- let vector = VCons 1 (VCons 2 VNil)
-- >>> vector !!! (SmallerThanN SmallerThanZ)
-- 2
-- >>> vector !!! (SmallerThanN (SmallerThanN SmallerThanZ))
-- • Couldn't match type ‘'S 'Z’ with ‘'Z’
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment