Unit
のモデル「無限」のベクトルに有限のベクトルを接着するために和タイプを使用して、有限
Vector
Sの「
ZipVector
」スタイル
Applicative
作りました
。依存型指定された「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
これはおそらく、私のニーズには十分だろうが、私はぼんやりあなたが依存して入力した「ベクトル」ので得ることができますApplicativeのインスタンスをモデルにした「固定次元」ものを望んでいました。 d
ファントムパラメータがタイプレベルNat
ある
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にreifiedDimension
を書き込むことができますか?さらに、可能であれば、(Point v1) :: Point d1 a
と(Point v2) :: Point d2 a
を入手するにはどうすればlength v1 == length v2
を入手できますか?d1 ~ d2
を入手できますか?
あなたは 'トップ::ベクトルのようなスマートなコンストラクタを持つと言うことを意味しますか?私はそれを働かせようとしてきましたが、失敗しました。タイプエラーが何を言っているのかをまだ正確に把握することはできません。 –
@tel:次のようなものを試してみてください:http://hpaste.org/86437 – hammar
私は 'pLen :: SingI d => Point d a - > Sing dのようなものを使って再検証しようとします。 pLen _ = sing' GHCは、「pLenの使用に起因する(SingI Nat d0)のインスタンスがない」という文句を言います。 –