repaの周りに薄いラッパーを書き込んで、私がやっているドメイン固有の作業に余分な制約を与えようとしています。ラップされたRepa配列の可変インナータイプ
newtype Tile p r a = Tile { _array :: Array r DIM2 a }
Array
がrepa
から来ている:私はタイプがあります。残念ながら
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 Int
とArray D DIM2 Int
を含ま
foo :: Tile p a -> Tile p b -> Tile p c
。これは欲しいことは悪いことですか?
実際の 'data'宣言を使用する必要がありますが、' data tile p a = forall d。 Tile {_array :: Array d Dim2 a} 'となります。 – Alec
それは私が必要とするものに近いですね。しかし、 'd'にはいくつかの型クラスの制約があります。S –
' data'宣言に制約を入れることもできます。 'データShowable = forall a。 a => SomeShow a'を表示します。 – Alec