Я просматриваю пакет Cloud Haskell Encoding.hs и столкнулся с каким-то странным кодом, который я надеялся, что кто-то может помочь мне лучше понять, Включен необходимый код:
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
Мне просто интересно, что такое $! (я угадываю, просто строго оценивает), а также почему нам нужен трюк id (что-то с ленивой оценкой?). Также у меня проблемы с этой линией:
if (decode $! payloadType a) == show (typeOf $ id undefined)
Я предполагаю, что это видно, если payloadType недействителен по какой-либо причине, но если это так, не следует переключать предложения then и else, то есть change:
if (decode $! payloadType a) == show (typeOf $ id undefined)
then Just (id $! decode pc)
else Nothing
к
if (decode $! payloadType a) == show (typeOf $ id undefined)
then Nothing
else Just (id $! decode pc)
Спасибо за любую помощь, которую вы можете предоставить.