Как написать экземпляр Data.Vector.Unboxed в Haskell?

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из Scores. Пытаясь настроить производительность, я решил попробовать использовать Data.Vector.Unboxed. Однако мне нужно написать экземпляр для Unbox, который не может быть получен, и я не могу понять, что мне нужно делать (в частности, какой контракт для Unboxкласс типа есть). Поскольку Scoreна самом деле является Doubleс некоторыми полезными конструкторами и семантикой, я думаю, это должно быть возможно. Насколько я могу судить, мне нужно иметь возможность сказать Data.Vector.Unboxed, насколько большим должен быть каждый слот в векторе Scores, и я думаю, как читать и напишите их (но, черт возьми, они очень похожи на Doubles).

Итак, что мне делать? Спасибо!

17
задан Noah Daniels 2 June 2012 в 23:22
поделиться