如何在Haskell中编写Data.Vector.Unboxed实例?

时间:2012-06-02 23:22:07

标签: haskell typeclass unboxing

我有一个数字应用程序,它使用概率的负日志做了很多工作,其中(因为概率范围从0到1)采用正双精度值或负无穷大(如果潜在概率为零)

我正在使用newtype Score,如下所示:

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

现在,在Viterbi算法的实现中,我一直在使用Data.Vector,实际上我有一些Data.Vector的{​​{1}} s。在尝试进行性能调整时,我决定尝试使用Score。但是,我需要为Data.Vector.Unboxed编写一个无法派生的实例,而且我无法弄清楚我需要做什么(特别是Unbox类型类的合约是什么)。由于Unbox实际上是一个带有一些有用的构造函数和语义的Score,所以这应该是可能的,我想。据我所知,我需要能够告诉Double Data.Vector.Unboxed s向量中的每个插槽必须有多大,我想如何读取和写入它们(但是,他们,他们'很像Score s。。

那么,我该怎么办?谢谢!

1 个答案:

答案 0 :(得分: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)