17

我有一个数字应用程序,它对概率的负对数做了很多工作,它(因为概率范围从零到一)取正双精度值或负无穷大(如果基础概率为零)。

我将这些与新类型一起使用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.Vectors Score。在尝试进行一些性能调整时,我决定尝试使用Data.Vector.Unboxed. 但是,我需要为 编写一个Unbox不能派生的实例,而且我不太清楚我需要做什么(特别是类型类的契约是什么Unbox)。由于Score确实Double具有一些有用的构造函数和语义,我认为这应该是可能的。据我所知,我需要能够判断sData.Vector.Unboxed向量中的每个插槽Score必须有多大,并且我猜如何读取和写入它们(但见鬼,它们很像Doubles)。

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

4

1 回答 1

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)
于 2012-06-02T23:29:41.963 回答