我有一个数字应用程序,它对概率的负对数做了很多工作,它(因为概率范围从零到一)取正双精度值或负无穷大(如果基础概率为零)。
我将这些与新类型一起使用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
s Score
。在尝试进行一些性能调整时,我决定尝试使用Data.Vector.Unboxed
. 但是,我需要为 编写一个Unbox
不能派生的实例,而且我不太清楚我需要做什么(特别是类型类的契约是什么Unbox
)。由于Score
确实Double
具有一些有用的构造函数和语义,我认为这应该是可能的。据我所知,我需要能够判断sData.Vector.Unboxed
向量中的每个插槽Score
必须有多大,并且我猜如何读取和写入它们(但见鬼,它们很像Double
s)。
那么,我该怎么办?谢谢!