, . , , , .
@Benjamin Hodgson, , , , , , .
. , :
{-
{-
{-
{-
data Nat = Zero | Succ Nat
-- A vector type
data Vec n a where
V0 :: Vec Zero a
(:>) :: a -> Vec n a -> Vec (Succ n) a
infixr 5 :>
"" (+), . , m n, :
type family m + n where
Zero + m = m
Succ m + n = Succ (m + n)
(++) , :
vappend :: Vec m a -> Vec n a -> Vec (m + n) a
vappend V0 ys = ys
vappend (x :> xs) ys = x :> vappend xs ys
, :
rev :: [a] -> [a] -> [a]
rev ys [] = ys
rev ys (x:xs) = rev (x:ys) xs
reverse:
reverse' = rev []
vrev, :
vrev :: Vec m a -> Vec n a -> Vec (n + m) a
vrev ys V0 = ys
vrev ys (x :> xs) = vrev (x :> ys) xs
, , GHC :
(n1 + 'Succ m) ~ 'Succ (n1 + m)
"" .
n + m m + n - .
, + :
Succ m + n = m + Succ n
, vrev , vappend !
, ? , , , "" . :
Succ m + n = Succ (m + n)
. , , , singletons-nats.