小编car*_*emb的帖子

通常导出大规模代数数据类型的任意?

我有一个我输入的协议:

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)

generics haskell quickcheck

11
推荐指数
1
解决办法
532
查看次数

如何在Haskell记录中一般提取字段名称和值

我最近了解到我可以在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)

我怎样才能解开给定记录中的所有值,就像我可以解开记录的字段名称一样?

generics haskell record

2
推荐指数
1
解决办法
600
查看次数

标签 统计

generics ×2

haskell ×2

quickcheck ×1

record ×1