Quick actions

cmd+k|ctrl+k

Navigation

Languages

Vector (a :: *) (n :: Nat)

Snippet info

Language

Haskell

Visibility

public

Author

homam

Created

2016-10-08T13:55:12Z

Updated

2016-10-09T14:53:16Z

{-# LANGUAGE GADTs, KindSignatures, DataKinds, StandaloneDeriving #-}

data Nat = Z | S Nat deriving (Show, Eq)

toInt Z = 0
toInt (S a) = 1 + toInt a

data Vector (a :: *) (n :: Nat)  where -- Vector a (n :: Nat)
  Nil  :: Vector a Z
  (:-) :: a -> Vector a n -> Vector a (S n)
  
infixr 5 :-

deriving instance Show a => Show (Vector a n)

vlength :: Vector a n -> Int
vlength = toInt . slength

slength :: Vector a n -> Nat
slength Nil = Z
slength (a :- b) = S (slength b)

type Two = S (S Z)

main = do 
    let vec = "Hello" :- "World" :- Nil :: Vector String Two
    print vec
    print $ slength vec
    print $ vlength vec
INFO