gpt4 book ai didi

haskell - Repa --- 如何制作一个Read实例?

转载 作者:行者123 更新时间:2023-12-02 10:10:56 26 4
gpt4 key购买 nike

最好的制作方法是什么

type Configuration = Array DIM1 (Double, Double, Double)

Read 的一个实例?所以后来我可以得出

data SimulationData = SD Configuration Double StdGen Int

也成为 Read 的一个实例。

最佳答案

这样的实例将是 orphan instance ,您通常应该避免这种情况。不过,写起来相当简单:

{-# LANGUAGE TypeOperators #-}

import Data.Array.Repa (Array, Shape, Elt, Z(..), (:.)(..))
import qualified Data.Array.Repa as R

instance Read Z where
readsPrec _ r = do
("Z", s) <- lex r
return (Z, s)

instance (Read tail, Read head) => Read (tail :. head) where
readsPrec d =
readParen (d > prec) $ \r -> do
(tl, s) <- readsPrec (prec + 1) r
(":.", t) <- lex s
(hd, u) <- readsPrec (prec + 1) t
return (tl :. hd, u)
where prec = 3

instance (Shape sh, Read sh, Elt a, Read a) => Read (Array sh a) where
readsPrec d =
readParen (d > app) $ \r -> do
("Array", s) <- lex r
(sh, t) <- readsPrec (app + 1) s
(xs, u) <- readsPrec (app + 1) t
return (R.fromList sh xs, u)
where app = 10

如果您使用StandaloneDeriving扩展,则可以简化前两个实例:

deriving instance Read Z
deriving instance (Read tail, Read head) => Read (tail :. head)

这些实例可能应该在 repa 本身中;我只是基于 Text.Show 中给出的示例实例和 repa 的 show 输出。我建议在 repa 的 bug tracker 上提出功能请求,并暂时将这些实例放入程序的模块中(除非您想完全避免孤立实例,在这种情况下,您将不得不完全以另一种方式解决问题)。

<小时/>

也就是说,您可能应该考虑简单地将数据转换为列表(使用 toList)并使用它;它避免了孤儿实例,并且不应该有任何缺点。您可能还想考虑使用“真正的”序列化库,例如 cereal如果您更感兴趣的是用代码处理数据而不是使其成为人类可读的数据; Read 通常被认为用途相当有限。

关于haskell - Repa --- 如何制作一个Read实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com