2011-12-31 24 views
19

tôi có thể làm như sau:Trong trường hợp nào thì `đọc` của Haskell trả về nhiều mục danh sách?

Prelude> reads "1 2 3" :: [(Int, String)] 
[(1," 2 3")] 
Prelude> reads "(1,2) (3,4)" :: [((Int, Int), String)] 
[((1,2)," (3,4)")] 
Prelude> reads "(1,2)(3,4)" :: [((Int, Int), String)] 
[((1,2),"(3,4)")] 
Prelude> reads "(1,2)\n(3,4)" :: [((Int, Int), String)] 
[((1,2),"\n(3,4)")] 
Prelude> reads "(1,2) (3,4)" :: [((Int, Int), String)] 
[((1,2)," (3,4)")] 

tôi có thể lấy được Read và nhận được đọc để đọc những quá. Nhưng tôi chưa bao giờ nhận được lần đọc để trả lại nhiều hơn một bộ trong danh sách. Tại sao reads trả về một danh sách?

Trả lời

16

Không có trường hợp chuẩn nào làm như vậy, nhưng nó dành cho các phân tích không rõ ràng; vì điều này không thực sự hữu ích và các trình phân tích cú pháp sử dụng chức năng này sẽ rất không hiệu quả, giá trị trả lại của reads là dành cho tất cả các mục đích thực tế một Maybe giả mạo dưới dạng [].

Các Report's definition of read cho thấy ý nghĩa đích của nhiều phân tích:

read :: (Read a) => String -> a 
read s = case [x | (x,t) <- reads s, ("","") <- lex t] of 
       [x] -> x 
       [] -> error "PreludeText.read: no parse" 
       _ -> error "PreludeText.read: ambiguous parse" 

Vì vậy: lý do lịch sử, về cơ bản.

+0

Cảm ơn bạn đã làm rõ. Cần phải biết nếu tôi đã bỏ lỡ một cái gì đó. – Ana

3

Bạn có thể xác định Read trường hợp cho các kiểu dữ liệu có thể trả về nhiều mục trong reads. Tôi đã không đi qua một tình huống mà nó sẽ có ý nghĩa, nhưng nó có thể.

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