Я сделал себе стиль "ZipVector
" 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
Этого, вероятно, будет достаточно для моих нужд, но я лениво хотел, чтобы "Fixed Dimensional" был смоделирован на аппликативных экземплярах, которые вы можете получить с зависимо типизированными "Vector".
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
является уровнем типа Nat
. Как я могу (если это возможно) написать reifiedDimension
на Haskell? Более того, опять же, если возможно, учитывая (Point v1) :: Point d1 a
и (Point v2) :: Point d2 a
, как я могу получить length v1 == length v2
, могу ли я получить d1 ~ d2
?