Estoy mirando el paquete de Cloud Haskell Encoding.hs, y encontré un código extraño que esperaba que alguien podría ayudarme a comprender mejor. Incluido es el código necesario:haskell código mágico, ¿qué está pasando aquí?
class (Binary a,Typeable a) => Serializable a
instance (Binary a,Typeable a) => Serializable a
data Payload = Payload
{
payloadType :: !ByteString,
payloadContent :: !ByteString
} deriving (Typeable)
serialDecodePure :: (Serializable a) => Payload -> Maybe a
serialDecodePure a = (\id ->
let pc = payloadContent a
in pc `seq`
if (decode $! payloadType a) == show (typeOf $ id undefined)
then Just (id $! decode pc)
else Nothing) id
Solo tengo curiosidad acerca de qué $! lo hace (supongo que solo evalúa estrictamente), y también por qué necesitamos el truco de identificación (¿algo con evaluación perezosa?). También estoy teniendo problemas específicamente con esta línea:
if (decode $! payloadType a) == show (typeOf $ id undefined)
supongo esto es ver si el payloadType es inválida por cualquier razón, pero si ese es el caso no debería entonces y demás conmutarse cláusulas, es decir, el cambio:
if (decode $! payloadType a) == show (typeOf $ id undefined)
then Just (id $! decode pc)
else Nothing
a
if (decode $! payloadType a) == show (typeOf $ id undefined)
then Nothing
else Just (id $! decode pc)
Gracias por cualquier ayuda que puede proporcionar.
Sí, 'f $! x' es una aplicación estricta. Puede encontrar [este artículo] (http://neilmitchell.blogspot.com/2008/05/bad-strictness.html) esclarecedor sobre cómo funciona el rigor de adición. –
Vea también http://stackoverflow.com/q/2787543/246886 –