5

作るための最良の方法は何ですか

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

読み取りのインスタンス?だから後で私は導き出すことができた

data SimulationData = SD Configuration Double StdGen Int

Readのインスタンスにもなります。

4

1 に答える 1

6

このようなインスタンスは孤立したインスタンスになりますが、通常は避ける必要があります。ただし、それを書くのはかなり簡単です。

{-# 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、最初の2つのインスタンスを簡略化できます。

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

これらのインスタンスは、おそらくrepa自体にあるはずです。Text.Showとrepaのshow出力で与えられたサンプルインスタンスに基づいています。repaのバグトラッカーで機能をリクエストし、これらのインスタンスをプログラムのモジュールに入れることをお勧めします(孤立したインスタンスを完全に避けたい場合は、別の方法で問題を解決する必要があります)。


そうは言っても、おそらくデータを(をtoList使用して)リストに変換し、それを使用することを検討する必要があります。孤立したインスタンスを回避し、欠点はありません。人間が読める形式よりもコードを使用してデータを処理することに関心がある場合は、シリアルなどの「実際の」シリアル化ライブラリの使用を検討することもできます。Read一般的に、使用はかなり限られていると考えられています。

于 2011-12-24T14:05:14.833 に答える