2012-06-02 8 views
17

私は確率の負のログを使って多くの仕事をしています。(確率は0から1までの範囲であるため)正の倍数の値、または負の無限大の値をとります。HaskellでData.Vector.Unboxedインスタンスを作成するにはどうすればよいですか?

newtype Score = Score Double 
    deriving (Eq, Ord) 
--^A "score" is the negated logarithm of a probability 

negLogZero :: Score --^Stands in for - log 0 
negLogZero = Score 10e1024 

negLogOne :: Score --^- log 1 
negLogOne = Score 0.0 

unScore :: Score -> Double 
unScore (Score x) = x 

instance Show Score where 
    show (Score x) = show x 

を今、私は多くのことをData.Vector使用してきたビタビアルゴリズムの実装では、実際に私はいくつかのData.Vector秒を持っている:

次のように私はnewtypeのScoreでこれらを使用していますScore s。パフォーマンスチューニングを試みているうちに、Data.Vector.Unboxedを試してみることにしました。しかし、私はUnboxのインスタンスを作成する必要があります。これは導き出すことができません。私は何をする必要があるのか​​よく分かりません(特に、Unbox型の契約です)。 Scoreは実際には便利なコンストラクタとセマンティクスを持つDoubleなので、これは可能なはずです。私が言うことができる限り、私はScoreのベクトルの各スロットがどれくらい大きくなければならないかをData.Vector.Unboxedに伝えることができる必要があります。そして、それらを読み書きする方法を推測します(しかし、彼らはDoubleとよく似ています) 。

どうすればいいですか?ありがとう!

答えて

15

Unboxタイプのクラスにはメソッドがありません。VectorMVectorタイプのクラスの省略形です。それらを派生させ、Unboxクラスは無料で提供されます(派生によって、またはinstance U.Unbox Scoreをどこかの行に書いて)。

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
import Data.Vector.Generic.Base 
import Data.Vector.Generic.Mutable 
import qualified Data.Vector.Unboxed as U 
newtype Score = Score Double deriving (Vector U.Vector, MVector U.MVector, U.Unbox) 
+0

大変感謝! –

+2

これは、ghc 7.8.4では動作しなくなりました。 'Data.Vector.Primitive.Vector Double'と 'U.Vector'が 'Data.Vector.Primitive.Vector Double'から 'U.Vector Score'スコアは異なるタイプです。可能性のある修正:スタンドアロンの「インスタンスを導出する」を使用して、 'U.Vector Double - > Int'型のメソッド 'Data.Vector.Generic.Base.basicLength' (Vector U.Vector Score) ' – unhammer

+1

https://ghc.haskell.org/trac/ghc/ticket/9112のインスタンスを派生させた場合は、私は見えませんが、関連性があるようです彼らは解決策に言及しました。 – unhammer

関連する問題