2011-11-19 24 views
5

Tôi có câu hỏi: Làm cách nào để ghi đè phương thức hiển thị cho Chuỗi hoặc Char? Cảm ơn.Ghi đè phương thức hiển thị cho Chuỗi/Char trong Haskell

+1

Có lý do nào khiến bạn không muốn chỉ xác định một số chức năng khác của loại 'Char -> String' hoặc' String -> String'? Tại sao bạn muốn ghi đè lên 'show'? – hammar

+4

Tôi nghĩ bạn phải bọc nó trong một [loại mới] (http://www.haskell.org/haskellwiki/Newtype) và xác định Hiển thị cho loại đó. –

Trả lời

2

Nếu bạn muốn làm điều này, thì bạn đang làm sai.

Vì lý do kỹ thuật hơn, hãy xem my answer cho câu hỏi trước.

Bạn thực sự nên sử dụng một trong hai a -> String chức năng của riêng bạn (có thể thông qua loại-class của riêng bạn) hoặc sử dụng một thư viện khá-in cho kết quả đầu ra chi tiết hơn (một số trong đó đã có một Pretty lớp sẵn có).

8

Kể từ khi mọi người dường như thích nhận xét của tôi, ở đây nó là như một câu trả lời:

Nếu bạn muốn reimplement các lớp học kiểu trên các loại hiện có, bạn có thể bọc chúng trong một loại -declared newtype. Điều này cho phép bạn xác định các triển khai của riêng bạn, mà không có bất kỳ chi phí thực tế nào khi chạy (vì newtype là đẳng cấu đối với kiểu gốc, không có thực hiện boxing nào khi chạy).

này có thể giống như thế này:

newtype MyChar = MyChar Char 

instance Show MyChar where 
    show (MyChar c) = "head \"" ++ c : "\"" 

Bạn có thể sử dụng điều này bằng cách gói Char s với MyChar, như vậy:

print $ fmap MyChar "test" 

này sẽ in ra

[head "t",head "e",head "s",head "t"] 
+0

Bạn cũng có thể xác định showList, sau đó danh sách MyChar cũng sẽ có định dạng tùy chỉnh. Trong thực tế, đây là lý do tại sao hiển thị danh sách các ký tự ([Char]) hoạt động khác với hiển thị các danh sách khác ([a]). – sdcvvc

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