我一直在玩矢量和矩阵,其中大小按其类型编码,使用新的DataKinds
扩展名.它基本上是这样的:
data Nat = Zero | Succ Nat
data Vector :: Nat -> * -> * where
VNil :: Vector Zero a
VCons :: a -> Vector n a -> Vector (Succ n) a
Run Code Online (Sandbox Code Playgroud)
现在我们想要像Functor
和的典型实例Applicative
.Functor
简单:
instance Functor (Vector n) where
fmap f VNil = VNil
fmap f (VCons a v) = VCons (f a) (fmap f v)
Run Code Online (Sandbox Code Playgroud)
但是对于Applicative
实例存在一个问题:我们不知道纯粹返回什么类型.但是,我们可以根据向量的大小来定义实例:
instance Applicative (Vector Zero) where
pure = const VNil
VNil <*> VNil …
Run Code Online (Sandbox Code Playgroud)