custom - instance of haskell
¿Cómo escribo una instancia de Data.Vector.Unboxed en Haskell? (1)
La clase de tipos Unbox
no tiene ningún método, es solo una abreviatura de las clases de tipos Vector
y MVector
. Derive esos, y la clase Unbox
viene gratis (ya sea a través de derivar o simplemente escribiendo la instance U.Unbox Score
en su propia línea en algún lugar).
{-# 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)
Tengo una aplicación numérica que hace mucho trabajo con registros de probabilidades negativas, que (dado que las probabilidades varían de cero a uno) toman los valores de dobles positivos o infinito negativo (si la probabilidad subyacente era cero).
Estoy usando estos con un Newtype Score
siguiente manera:
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
Ahora, en una implementación del algoritmo Viterbi, he estado usando mucho Data.Vector
, y de hecho tengo algunos Data.Vector
s de Score
s. Mientras intentaba hacer algunos ajustes de rendimiento, decidí intentar usar Data.Vector.Unboxed
. Sin embargo, necesito escribir una instancia para Unbox
, que no se puede derivar, y no puedo entender qué debo hacer (en particular, cuál es el contrato para la clase de tipos de Unbox
). Ya que Score
es realmente un Double
con algunos constructores y semánticas útiles, esto debería ser posible, creo. Por lo que puedo decir, necesito poder decirle a Data.Vector.Unboxed
qué tan grande debe ser cada ranura en un vector de Score
s, y creo que cómo leerlas y escribirlas (pero demonios, son muchas como Double
s).
¿Entonces qué hago? ¡Gracias!