我想构建一个备用的 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/