2013-04-23 15 views
5
Kendimi Unit s modeli "sonsuz" vektörler için sonlu vektörleri tutkal bir miktar türünü kullanan sonlu Vector s üzerinde " ZipVector" tarzı Applicative yaptık

.bağımlı yazılan 'ZipVector' Applicatives

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 

Bu muhtemelen benim ihtiyaçları için yeterli olacaktır, ama ben boş boş istediğim bir "Sabit Boyutlu" Eğer bağımlı yazılan "Vektör" s ile alabilirsiniz uygulamalı örnekleri örnek alınarak bir. d fantom parametresi bir tür düzeyinde Nat olan

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 

. Haskell'de reifiedDimension yazabilir miyim? Ayrıca, mümkünse, (Point v1) :: Point d1 a ve (Point v2) :: Point d2 a verilirse length v1 == length v2'u nasıl alabilirim d1 ~ d2 alabilir miyim?

cevap

4

Haskell'de nasıl yazılır (0 ise) reifiedDimension?

GHC.TypeLits ve ScopedTypeVariables kullanma:

instance SingI d => Applicative (Point d) where 
    pure = Point . Vector.replicate reifiedDimension 
    where reifiedDimension = fromInteger $ fromSing (sing :: Sing d) 
    ... 

tam örneğin my answer here bakınız.

yine mümkünse Üstelik, (Point v1) :: Point d1 a verildi ve ben d1 ~ d2 alabilirim (Point v2) :: Point d2 a nasıl length v1 == length v2 alabilirim?

Data.Vector ile, no. Türdeki uzunluğu kodlayan bir vektör türüne ihtiyacınız vardır. Yapabileceğiniz en iyi şey, bunu kendiniz korumak ve Point yapıcısını dışa aktarmamakla kapsüllemek.

+0

"d :: Sing (Vector.length v)' ifadesini yansıtan "toP :: Vector a -> Point d a" gibi bir akıllı kurucunun sahip olduğunu söylemek ister misiniz? Çalışmaya çalışıyorum ama başarısız oluyor ve henüz tip hatalarının ne söylediğini tam olarak anlayamıyorum. –

+0

@tel: Şunun gibi bir şey deneyin: http://hpaste.org/86437 – hammar

+0

Bunu pLen :: SingI d => Point d a -> Sing d gibi bir şeyle yeniden ilişkilendirmeyi denediğimde; pLen _ = şarkı 'GHC, 'pLen' kullanımından kaynaklanan (SingI Nat d0) için bir örnek yoktur. –