我有一个我输入的协议:
data ProtocolPacket
= Packet1 Word8 Text Int8
| Packet2 Text
| Packet3 Int Text Text Text Text
| Packet4 Int Double Double Double Int16 Int16 Int16
...
deriving (Show,Eq)
Run Code Online (Sandbox Code Playgroud)
另外,我已经为每个数据包实现了序列化/反序列化代码.当然,我想在Quickcheck中测试这个协议,并确保对任何输入组合的任何数据包进行序列化和反序列化都会让我准确地回复我所放入的内容.所以我继续为Arbitrary类型类实现这些数据包,如下所示:
instance Arbitrary ProtocolPacket where
arbitrary = do
packetID <- choose (0x00,...) :: Gen Word8
case packetID of
0x00 -> do
a <- arbitrary
b <- arbitrary
c <- arbitrary
return $ Packet1 a b c
0x01 -> do
a <- arbitrary
return $ Packet2 a
0x02 -> …Run Code Online (Sandbox Code Playgroud) 我最近了解到我可以在Haskell中执行以下操作:
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
data MyRecord = MyRecord
{ field1 :: Int
, field2 :: String
, field3 :: String
} deriving (Show,Eq,Data,Typeable)
main = print $ constrFields (toConstr (MyRecord 5 "Hello" "World"))
Run Code Online (Sandbox Code Playgroud)
这将给我以下内容:
["field1","field2","field3"]
Run Code Online (Sandbox Code Playgroud)
如何对记录中的值执行相同的操作,如下所示:
["5","Hello","World"]
Run Code Online (Sandbox Code Playgroud)
我问,因为我正在使用Aeson像这样的简单JSON:
{
"field1":5,
"field2":"Hello",
"field3":"World"
}
Run Code Online (Sandbox Code Playgroud)
并生成如下的Haskell代码:
field1 :: Int
field1 = 5
field2 :: String
field2 = "Hello"
field3 :: String
field3 = "World"
Run Code Online (Sandbox Code Playgroud)
我怎样才能解开给定记录中的所有值,就像我可以解开记录的字段名称一样?