2011-12-24 19 views
5

Cách tốt nhất để thực hiệnRepa --- Cách tạo một thể hiện Đọc?

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

một thể hiện Đọc? Vì vậy, sau này tôi có thể lấy được

data SimulationData = SD Configuration Double StdGen Int 

là một thể hiện của Đọc.

+0

Tôi nghi ngờ bạn không thể tạo phiên bản đã đọc "đầy đủ". Nói chung, các kiểu dữ liệu quan trọng sẽ có các cá thể Đọc nếu tác giả tin rằng chúng có ý nghĩa. Loại 'Array' trong Repa có các hàm bậc cao hơn bên trong các thành phần của nó -' Generator' và 'Range' không thể tạo ra các thể hiện của Read. Tôi tưởng tượng điều chính xác cần làm là serialize/de-serialize dữ liệu của bạn thành một định dạng đơn giản hơn. –

Trả lời

6

Ví dụ như vậy sẽ là orphan instance, thông thường bạn nên tránh. Tuy nhiên, nó khá đơn giản để viết nó:

{-# 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 

Nếu bạn sử dụng phần mở rộng StandaloneDeriving, hai trường hợp đầu tiên có thể được đơn giản hóa:

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

Những trường hợp lẽ ​​phải ở trong repa bản thân; Tôi chỉ dựa trên ví dụ được đưa ra trong Text.Show và sản lượng show của repa. Tôi khuyên bạn nên đưa ra yêu cầu tính năng trên bug tracker của repa và đặt các trường hợp này vào mô-đun chương trình của bạn ngay bây giờ (trừ khi bạn muốn tránh hoàn toàn các trường hợp mồ côi, trong trường hợp này bạn sẽ phải giải quyết vấn đề theo cách khác).


Điều đó nói rằng, bạn có lẽ nên xem xét đơn giản chuyển đổi dữ liệu của mình thành danh sách (với toList) và sử dụng; nó tránh trường hợp trẻ mồ côi, và không nên có bất kỳ nhược điểm nào. Bạn cũng có thể muốn xem xét sử dụng thư viện tuần tự "thực" như cereal nếu bạn quan tâm nhiều hơn đến việc xử lý dữ liệu có mã hơn là có thể đọc được con người; Read thường được coi là sử dụng khá hạn chế.

+0

Loại 'Array' trong Repa được tạo từ danh sách các vùng chứa' Range' và 'Generator', cả Range Generator có hàm bậc cao hơn làm thành phần để chúng không thể thực hiện được các trường hợp Đọc. –

+0

@stephentetley: Tất cả trường hợp 'Read' phải có khả năng làm là phân tích cú pháp mã Haskell hợp lệ mà kết quả đầu ra' Show' tương ứng. – ehird

+0

'show $ R.fromFunction (Z:. (10 :: Int)) (const 42)' = '" Mảng (Z:. 10) [42.0,42.0,42.0,42.0,42.0,42.0,42.0,42.0, 42.0,42.0] "', ví dụ của tôi phân tích cú pháp chính xác. – ehird

Các vấn đề liên quan