Tôi đang xem qua gói Cloud Haskell Encoding.hs và gặp phải một số mã lạ mà tôi hy vọng ai đó có thể giúp tôi hiểu rõ hơn. Bao gồm là mã cần thiết:mã ma thuật haskell, những gì đang xảy ra ở đây
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
Tôi chỉ tò mò về những gì $! (Tôi đoán chỉ là đánh giá nghiêm túc), và cũng là lý do tại sao chúng ta cần lừa id (một cái gì đó với đánh giá lười biếng?). Ngoài ra tôi đang đặc biệt gặp vấn đề với dòng này:
if (decode $! payloadType a) == show (typeOf $ id undefined)
Tôi đoán này được nhìn thấy nếu PayloadType là không hợp lệ vì lý do gì, nhưng nếu đó là trường hợp nên không phải là sau đó và else khoản được bật, tức là thay đổi:
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)
Nhờ sự giúp đỡ bạn có thể cung cấp.
Có, 'f $! x' là ứng dụng nghiêm ngặt. Bạn có thể tìm thấy [bài viết này] (http://neilmitchell.blogspot.com/2008/05/bad-strictness.html) khai sáng về cách thêm tính nghiêm ngặt hoạt động. –
Xem thêm http://stackoverflow.com/q/2787543/246886 –