haskell - 酒庄类型的索引在哪里?

标签 haskell serialization

我想构建一个备用的 Winery 模式解码器。所以我查看了一些编码模式:

*Codec.Winery> B.unpack $ serialiseSchema $ schema (Proxy :: Proxy Void)
[4,5,0]
*Codec.Winery> B.unpack $ serialiseSchema $ schema (Proxy :: Proxy Bool)
[4,6]
*Codec.Winery> B.unpack $ serialiseSchema $ schema (Proxy :: Proxy Int)
[4,16]
*Codec.Winery> B.unpack $ serialiseSchema $ schema (Proxy :: Proxy Integer)
[4,16]
*Codec.Winery> B.unpack $ serialiseSchema $ schema (Proxy :: Proxy Void)
[4,5,0]
*Codec.Winery> B.unpack $ serialiseSchema $ schema (Proxy :: Proxy ())
[4,3,0]

我知道第一个数字是架构版本。我知道 Int 可以编码为 Integer,因为它更小。但其他人呢?

我尝试将它与 bookstrapSchema 中提到的类型的索引进行比较但它们似乎不匹配。

如何理解这些数字?

最佳答案

它们匹配,但有些带有参数。忽略版本号 4,编码 [5,0] 表示具有零个替代项的 SVariant,基本上是没有构造函数的 sum 类型,AKA 无效:

data Void

另一方面,[3,0] 表示具有零字段的 SProduct,即具有单个空构造函数的类型,又名 ():

data () = ()

我建议查看除这些“退化”类型以外的总和和乘积类型,并研究 pretty 的输出 - 将模式与其序列化一起打印:

import Codec.Winery
import qualified Data.ByteString as B
import Data.Proxy
import Prettyprinter

main = do
  let s = schema (Proxy :: Proxy (Either Int String))
  print $ B.unpack . serialiseSchema $ s
  print $ pretty s

这里的编码和 pretty-print 模式是:

[4,5,2,4,76,101,102,116,3,1,16,5,82,105,103,104,116,3,1,2,7]
Left Integer | Right [Char]

这意味着:

[4                       -- version 4
,5,2                     -- SVariant with 2 alternatives, namely:
  ,4,76,101,102,116      --   4-character constructor "Left" for
    ,3,1                 --     SProduct with 1 field
      ,16                --       consisting of an SInteger
  ,5,82,105,103,104,116  --   5-character constructor "Right" for
    ,3,1                 --     SProduct with 1 field
      ,2                 --       consisting of an SVector
        ,7]              --         of SChar
       

关于haskell - 酒庄类型的索引在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65856745/

相关文章:

haskell - 如何针对实例为递归数据类型的类型类进行模式匹配?

c# - 将嵌套在动态对象中的 C# 列表中的第一项和最后一项序列化为 JSON

c# - 在 C# 中,如何序列化 Queue<>? (.Net 2.0)

haskell - 为什么惰性与引用透明性相得益彰?

haskell - 使用 $ 运算符将两个括号链接在一起

haskell - Haskell 中的 'where' 子句中的内容是否只计算一次?

java - 如何将 Map<String,String> 编码为 Base64 字符串?

serialization - 使用 MapReduce 读取/写入二进制输入/输出文件的最佳方式是什么?

c# - "No supported translation to SQL"反序列化 IQueryable 表达式后

haskell - Haskell 中的刚性类型变量