3

次の形式のデータ型があります。

data T = { a :: Int, b :: ComplexOtherDataType }

Data.Vector明らかに、これらをモジュールから通常のベクトルに入れることができます。しかし、私はaコンポーネントにアクセスするときに非常に優れたパフォーマンスが必要なので、余分な間接化は望ましくありません。私がやりたいのはT、のインスタンスを作成することですData.Vector.Unboxed.Unboxが、それでもb怠惰です。

vector-th-unboxインスタンスを作成するための素敵なテンプレート Haskell インターフェイスを提供しますがUnbox、私の場合は機能しません。Tのインスタンスを作成するには、Unboxの両方がインスタンスである必要があります。しかし、私は開梱したくありません。ボックス化/怠惰にしたい。a bb

私の直感によると、この障害を克服する最も簡単な方法は、型を提供することです

newtype LazyUnbox a = LazyUnbox a

次に、基本的にボックス化されていないベクター内にポインターを格納するだけのUnboxインスタンスを提供する必要があります。LazyUnboxこれどうやってするの?それとも、完全に良いアプローチがありますか?

4

2 に答える 2

10

「ポインターを unbox として保存する」(つまり、機械語) 値をどのように想像しますか? 私の知る限り、GHC ランタイムは管理構造へのポインタを取得することを許可していません。

トレードオフの解決策は、独自のVG.Vectorインスタンスを作成することです。

data TVector = TVector (VU.Vector Int) (V.Vector ComplexOtherDataType)

instance VG.Vector TVector T where
    basicUnsafeIndexM (TVector va vb) i = do
        a <- basicUnsafeIndexM va i
        b <- basicUnsafeIndexM vb i
        return (T a b)
    ...

必要に応じて、ボックス化されていない部分を抽出できVU.Vector Intます。

于 2013-06-24T03:36:59.913 に答える
1

Edward Kmett は、これとまったく同じことを行う方法を説明する投稿を書きまし た、しかし、私はそれがうまくいくと確信しています。hybrid-vectorsパッケージです。

于 2015-04-17T21:08:26.563 に答える