我正在查看Cloud Haskell軟件包的Encoding.hs,並遇到一些奇怪的代碼,我希望有人能幫助我更好地理解。包括的是必要的代碼:haskell魔法代碼,這裏發生了什麼
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)
我猜這是看到如果載荷類型是出於某種原因失效,但如果是這樣的情況下,不應該再和其他條款進行切換,即改變:
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)
感謝您的幫助,您可以提供。
是的,'f $! x'是嚴格的應用程序。你可能會發現[這篇文章](http://neilmitchell.blogspot.com/2008/05/bad-strictness.html)關於如何增加嚴格性的作品。 –
另請參見http://stackoverflow.com/q/2787543/246886 –