2012-06-11 22 views

Trả lời

11

Thư viện text-show hiện tồn tại và giải quyết chính xác vấn đề này.

Update (2016 Feb 12)

Các show chức năng được cung cấp trong thư viện basic-prelude cũng làm cho thẳng vào văn bản:

show :: Show a => a -> Text 

basic-prelude cũng có phụ thuộc ít hơn text-show. Nếu bạn muốn sử dụng basic-prelude, tiết kiệm cho mình đau đầu biên soạn bằng cách thêm dòng sau vào phía trên cùng của tập tin nguồn của bạn:

{-# LANGUAGE NoImplicitPrelude #-} 
+0

Trong cả prelude và prelude-prelude cơ bản có [tshow] (https://www.stackage.org/lts-8.23/hoogle?q=tshow) – mb21

2

Đó là tầm thường để viết chức năng riêng của bạn cõng tắt Show:.

showText :: Show a => a -> Text 
showText = pack . show 
+11

Điều này có ảnh hưởng đến hiệu suất không? tức là, tôi không tạo ra một 'Chuỗi 'lớn, sau đó chuyển đổi nó thành một' Văn bản', thay vì tạo ra 'Văn bản' trực tiếp? – jameshfisher

+2

Bạn không mất tất cả lợi ích của việc sử dụng Data.Text theo cách này? Bạn sử dụng văn bản chủ yếu là do các vấn đề prefromance 'String' - và theo cách này bạn ném tất cả các lợi nhuận ... – Sventimir

+0

Cho rằng kiểu chữ' Show' về cơ bản chỉ yêu cầu 'show :: a -> String', không có cách nào để triển khai 'showText' mà không cần phải thực hiện chuỗi. Các hàm 'tshow' trong prelude cơ bản và sang trọng cũng được thực hiện như thế này. – mb21

14

Vấn đề với việc tạo ra các văn bản trực tiếp là bạn vẫn cần phải biết kích thước tổng thể của các văn bản khối nghiêm ngặt trước khi điền nó trong Bạn có thể làm tốt hơn với chương trình Builder và sử dụng Data.Text.Lazy. Dan Doel thực hiện điều này trong bytestring-show, nhưng tôi không biết tương đương với Text.

+0

Nói về chức năng đọc/hiển thị ...Có thể một cặp ("chức năng đọc có thể thất bại", "hiển thị chức năng") cho một kiểu dữ liệu nhất định được biến thành một Prism từ Control.Lens? – danidiaz

+0

Đúng! Bạn cần khả năng chạy 'Read' và nhận ra nó có phù hợp hay không, mà chỉ được thêm gần đây vào cơ sở. –

5

Đối với trường hợp cụ thể của Int giá trị, đây là đoạn code để chuyển đổi chúng thành Text giá trị nghiêm ngặt mà không sử dụng Strings trong một giai đoạn trung gian:

import Data.Text 
import Data.Text.Lazy (toStrict) 
import Data.Text.Lazy.Builder (toLazyText) 
import Data.Text.Lazy.Builder.Int (decimal) 

showIntegral :: Integral a => a -> T.Text 
showIntegral = toStrict. toLazyText . decimal 

Mô-đun Data.Text.Lazy.Builder.RealFloat cung cấp chức năng tương tự cho các giá trị dấu chấm động.

Với những chúng ta có thể xác định một phiên bản của chúng tôi riêng của Show typeclass:

import Data.Text 
import Data.Text.Lazy (toStrict) 
import Data.Text.Lazy.Builder (toLazyText) 
import Data.Text.Lazy.Builder.Int (decimal) 
import Data.Text.Lazy.Builder.RealFloat (realFloat) 

class ShowText a where 
    showText :: a -> Text 

instance ShowText Int where 
    showText = toStrict . toLazyText . decimal 

instance ShowText Float where 
    showText = toStrict . toLazyText . realFloat 

Sau đó, chúng ta có thể bắt đầu thêm các trường hợp hơn (một cho các tuple sẽ có ích ví dụ).

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