2011-10-21 19 views
13

Vì vậy, tôi có một kiểu dữ liệuLàm thế nào để tạo ra thể hiện của đọc cho một kiểu dữ liệu trong Haskell

data SomeType a = 
    Type a | 
    Mix (SomeType a) (SomeType a) 

dụ chương trình của tôi này cho SomeType

instance (Show a) => Show (SomeType a) where 
    show (Type a) = show a 
    show (Mix a b) = "(" ++ show a ++ " " ++ show b ++ ")" 

Vì vậy

Mix (Type 5) (Type 4) 

sẽ cung cấp cho me

(5 4) 

Bây giờ tôi muốn có

read "(3 4)" :: SomeType Int 

sản xuất

(3 4) 

hoặc

read "(a b)" :: SomeType Char 

sản xuất

(a b) 

Tôi đang mất tích trên làm thế nào để sử dụng lớp đọc.

+0

btw, ví dụ của bạn cho 'SomeType Char' không phải là những gì' show (Mix (Type 'a') (Type 'b')) ' sẽ tạo ra. – hvr

+2

Bạn có thể lấy được cả hai - ví dụ Show và Read - với 'deriving (Show, Read)' sau kiểu delcaration. Mặc dù chúng không tạo ra đầu ra và đầu vào của bạn, chúng là một cách tiêu chuẩn để hiển thị (và đôi khi đọc) các giá trị, đó là lý do tại sao bạn nên sử dụng chúng thay vì các trường hợp của riêng bạn. Nếu bạn muốn hiển thị chúng theo một cách khác, hãy sử dụng một hàm riêng biệt và gọi nó là 'render' hoặc như vậy. – bzn

Trả lời

13

Dưới đây là một ví dụ dựa trên documentation mà sẽ có thể phân tích tất cả những gì show render (giả sử các loại có tương thích Read dụ định nghĩa), có nghĩa là read . show nên ít nhiều sắc:

instance (Read a) => Read (SomeType a) where 
    readsPrec d r = readMix r ++ readType r 
     where 
     readMix = readParen True $ \r -> do 
      (v1, r'') <- readsPrec d r 
      (v2, r') <- readsPrec d r'' 
      return (Mix v1 v2, r') 

     readType r = do 
      (v, r') <- readsPrec d r 
      return (Type v, r') 

Như vậy,

> read "(3 4)" :: SomeType Int 
(3 4) 
it :: SomeType Int 

Nhưng lưu ý, rằng cho SomeType Char trường hợp mặc định Show của Char vòm s nhân vật với dấu nháy đơn:

> read "('a' ('b' 'c'))" :: SomeType Char 
('a' ('b' 'c')) 
it :: SomeType Char 

hy vọng điều này giúp

+1

'd' và' r' trong 'readPrec dr' – nobody

+1

@Qin' d' là toán tử ưu tiên (mà tôi vô tình tăng lên - tôi đã chỉnh sửa điều này) của ngữ cảnh phân tích kèm theo và 'r' là hiện tại chuỗi còn lại sẽ được phân tích cú pháp. – hvr

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