I' У нас есть числовое приложение, которое много работает с отрицательными логарифмами вероятностей, которые (поскольку вероятности варьируются от нуля до единицы) принимают значения положительных двойников или отрицательную бесконечность (если исходная вероятность равна нулю).
Я использую их с 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
Теперь, в реализации алгоритма Витерби, я часто использую Data.Vector
, и действительно у меня есть несколько Data.Vector
из Score
s. Пытаясь настроить производительность, я решил попробовать использовать Data.Vector.Unboxed
. Однако мне нужно написать экземпляр для Unbox
, который не может быть получен, и я не могу понять, что мне нужно делать (в частности, какой контракт для Unbox
класс типа есть). Поскольку Score
на самом деле является Double
с некоторыми полезными конструкторами и семантикой, я думаю, это должно быть возможно. Насколько я могу судить, мне нужно иметь возможность сказать Data.Vector.Unboxed
, насколько большим должен быть каждый слот в векторе Score
s, и я думаю, как читать и напишите их (но, черт возьми, они очень похожи на Double
s).
Итак, что мне делать? Спасибо!