2017-06-28 5 views
1

repaの周りに薄いラッパーを書き込んで、私がやっているドメイン固有の作業に余分な制約を与えようとしています。ラップされたRepa配列の可変インナータイプ

newtype Tile p r a = Tile { _array :: Array r DIM2 a } 

Arrayrepaから来ている:私はタイプがあります。残念ながら

newtype Tile p a = Tile { _array :: Array ? DIM2 a } -- what should `?` be? 

rはREPA操作の間で変更することができます:それは署名を入力するノイズを付加し、Tile漏れやすい抽象化しますので、私はrを非表示にしたいと思います。ほとんどの場合、D(遅延表現の場合)ですが、リストまたはベクトルからデータを最初に作成するときは、U(「ボックス化されていないベクトル」)またはV(「ボックス化されたベクトル」)になります。これらは、操作を最適化するためのヒントとして使用されます。

rを私が望むように隠す方法はありますか?ラッパーTileのタイプチェックに影響することなく、内部的に自然に変化させることができますか?これはRankNTypesと友達のドメインですか?私は彼らをよく理解していないと認めます。最も明確にするために、私は書くことができるようにしたい:2つのTile引数はそれぞれ(例えば)Array U DIM2 IntArray D DIM2 Intを含ま

foo :: Tile p a -> Tile p b -> Tile p c

。これは欲しいことは悪いことですか?

+0

実際の 'data'宣言を使用する必要がありますが、' data tile p a = forall d。 Tile {_array :: Array d Dim2 a} 'となります。 – Alec

+0

それは私が必要とするものに近いですね。しかし、 'd'にはいくつかの型クラスの制約があります。S –

+0

' data'宣言に制約を入れることもできます。 'データShowable = forall a。 a => SomeShow a'を表示します。 – Alec

答えて

1

ラップされたArrayに、Dタイプのパラメータが常に含まれるようにして、delay functionを使用することで、この問題を回避できました。

また、これは私がnewtypeとしてTileを維持し、また、そのためのFunctorインスタンスを定義することができました。

関連する問題