type custom haskell typeclass unboxing

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!