Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 二进制最佳实践——何时严格以及如何严格_Haskell_Serialization - Fatal编程技术网

Haskell 二进制最佳实践——何时严格以及如何严格

Haskell 二进制最佳实践——何时严格以及如何严格,haskell,serialization,Haskell,Serialization,受此启发,我想向社区询问有关Binary的最佳实践。当我注意到我大量的Hyperedges(一种简单的代数数据结构)不会流式传输,而是立即加载时,我编写了myGet和myPut函数,它们使用10000个元素的块。正如对上述StackOverflow问题的回答中所述,我的实现不适用于二进制>=0.5。(我错过了。) 然而,我还注意到,当在类型参数中使用Int和Int32加载Hyperedges时,许多Word32s和Word64s被分配给以后才被转换。那是一次巨大的太空泄漏。如您所见,我在get中

受此启发,我想向社区询问有关
Binary
的最佳实践。当我注意到我大量的
Hyperedge
s(一种简单的代数数据结构)不会流式传输,而是立即加载时,我编写了
myGet
myPut
函数,它们使用10000个元素的块。正如对上述StackOverflow问题的回答中所述,我的实现不适用于二进制>=0.5。(我错过了。)

然而,我还注意到,当在类型参数中使用
Int
Int32
加载
Hyperedge
s时,许多
Word32
s和
Word64
s被分配给以后才被转换。那是一次巨大的太空泄漏。如您所见,我在
get
中尽早应用
deepseq
来“修复”它。我更喜欢一种更精细的方法,可能是使用
策略
,但我不能再使用
二进制
类型类,因为策略必须是一个附加参数

小结:现在,情况一团糟。你能提供“最佳实践”建议吗

实例(NFData v、NFData l、NFData i、B.二进制v、B.二进制l、B.二进制i、Ord v)
=>B.二进制(超边缘v l i)其中
放e=do
B.将(置于e)
B.put(从e开始)
B.put(标签e)
B.put(标识e)
--get=mkHyperedge B.get B.get B.get B.get B.get
得到=做
x1
instance (NFData v, NFData l, NFData i, B.Binary v, B.Binary l, B.Binary i, Ord v)
  => B.Binary (Hyperedge v l i) where
  put e = do
    B.put (to e)
    B.put (from e)
    B.put (label e)
    B.put (ident e)
  -- get = mkHyperedge <$> B.get <*> B.get <*> B.get <*> B.get
  get = do
    x1 <- B.get
    x2 <- x1 `deepseq` B.get
    x3 <- x2 `deepseq` B.get
    x4 <- x3 `deepseq` B.get
    x4 `deepseq` return (mkHyperedge x1 x2 x3 x4)


myGet
  :: (NFData v, NFData l, NFData i, B.Binary v, B.Binary l, B.Binary i, Ord v) 
  => B.Get [Hyperedge v l i]
myGet = do
  es1 <- B.get
  if null es1
    then return []
    else
      do
        es2 <- myGet
        return (es1 ++ es2)

myPut
  :: (NFData v, NFData l, NFData i, B.Binary v, B.Binary l, B.Binary i, Ord v) 
  => [Hyperedge v l i] -> B.Put
myPut es@[] = B.put es -- ([] :: [Hyperedge v l i])
myPut es = do
  B.put (take 10000 es)
  myPut (drop 10000 es)