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ế.
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. –