我在有限s 上为自己创建了一个“ ZipVector
”样式,它使用 sum 类型将有限向量粘合到模拟“无限”向量的 s 上。Applicative
Vector
Unit
data ZipVector a = Unit a | ZipVector (Vector a)
deriving (Show, Eq)
instance Functor ZipVector where
fmap f (Unit a) = Unit (f a)
fmap f (ZipVector va) = ZipVector (fmap f va)
instance Applicative ZipVector where
pure = Unit
Unit f <*> p = fmap f p
pf <*> Unit x = fmap ($ x) pf
ZipVector vf <*> ZipVector vx = ZipVector $ V.zipWith ($) vf vx
这可能足以满足我的需求,但我很想有一个“固定维度”模型,它以应用实例为模型,您可以通过依赖类型的“向量”获得。
data Point d a = Point (Vector a) deriving (Show, Eq)
instance Functor (Point d) where
fmap f (Point va) = Point (fmap f va)
instance Applicative Point where
pure = Vector.replicate reifiedDimension
Point vf <*> Point vx = Point $ V.zipWith ($) vf vx
其中d
phantom 参数是 type-level Nat
。我如何(如果可能)用reifiedDimension
Haskell 编写代码?此外,如果可能的话,再次给定(Point v1) :: Point d1 a
,(Point v2) :: Point d2 a
我怎么能length v1 == length v2
得到d1 ~ d2
?