3

最近、私はHaskellのRepaライブラリを使い始めました。これは、型族と関連する型に大きく依存しています。次のようにRepa配列を定義できます。

ghci> let x = fromListUnboxed (Z :. (5 :: Int) :. (2 :: Int)) [1..10]

次のように操作します。

ghci> computeP $ R.map id x :: IO (Array U DIM2 Double)
AUnboxed ((Z :. 5) :. 2) (fromList [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0])

ここで、Uは、結果がボックス化されていない配列として表されるようにする関連データ型です。DIM2は配列次元です。推測できたとしても、具体的な寸法を指定しなければならないのは好きではありません。代わりに、次のようなものを書きたいと思います。

ghci> computeP $ R.map id x :: Shape sh => IO (Array U sh Double)

これは有効ではありませんが、適切な関連データ型(この例ではU)を渡すことで配列型を指定できるようにすることを目的としていますが、形状は変更しません。そのようなことは可能ですか?

4

2 に答える 2

2

このようなものは機能しますか?

asArrayU :: Array U sh a -> Array U sh a
asArrayU = id

computeP $ asArrayU <$> R.map id x
于 2012-10-10T18:04:51.020 に答える
1

あなたの例

ghci> computeP $ R.map id x :: Shape sh => IO (Array U sh Double)

ここでは、結果の値が多形であり、任意の可能な形状を持つことができると宣言しているため、は機能しませんが、特定の形状を持っているため、これは明らかに正しくxありません。したがって、結果は同じ特定の形状、つまりDIM2

あなたが言うことができるのは、元々の形に関係なく、との組み合わせは同じ形computePを保持しているということです。R.map idつまり

ghci> (computeP . R.map id :: Shape sh => Array U sh Double -> IO (Array U sh Double)) x
AUnboxed ((Z :. 5) :. 2) (fromList [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0])

ここで重要なのは、ボックス化されていない値に表現をロックすることです。これは、コンパイラーが自動的に決定できない部分だからです。

しかし、実際のユースケースについて詳しく知らなければ、構文的に必要なものを表現するための最も優れたオプションを言うことは困難です。明示的な型を指定せずにGHCiでテストすることに主に関心がありますか、それとも実際のプログラムのどこかで明示的な型指定を避けたいですか?

たとえば、次のように定義できます

computeMap :: (Unbox a, Unbox b, Shape sh) => (a -> b) -> Array U sh a -> IO (Array U sh b)
computeMap f = computeP . R.map f

そして、あなたは言うことができます

ghci> computeMap id x
AUnboxed ((Z :. 5) :. 2) (fromList [1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0])
于 2012-10-11T09:02:41.267 に答える