2012-04-01 32 views
13

Tôi nghe rằng Data.Text sẽ thay thế String giây trong các phiên bản Haskell trong tương lai. Một vấn đề tôi có với điều này là (++) chỉ được xác định cho danh sách. Để nối hai số điện thoại Text s, tôi cần sử dụngCách tiêu chuẩn tham gia hai Data.Texts không có `mappend`

text1 `mappend` text2 

Được tiết lộ nhanh chóng. Lý tưởng nhất là tôi muốn có thể sử dụng ++ trên các số Text s này, nhưng nếu không, một giải pháp thay thế khác là gì? Tôi có thể định nghĩa toán tử infix của riêng mình, nhưng tôi muốn một cách tiêu chuẩn để làm điều này.

Trả lời

17

Từ GHC 7.4 (không chắc chắn phiên bản điểm nào) có một toán tử được xác định trước <> hoạt động giống như mappend. Vì vậy, bạn sẽ có thể nói

text1 <> text2 

Vì vậy, đó là toán tử "chuẩn", nhưng chưa có ở mọi nơi.

+1

Đó là toán tử có tên kém. '<>' có ngữ nghĩa "không bằng". Sẽ tốt hơn nếu khái quát hóa '++' để làm việc trên tất cả các Monoids. –

+8

<> đã được chọn bởi vì nó đã được sử dụng bởi các thư viện in ấn đẹp với ngữ nghĩa monoidal, và tùy chọn ít gây khó chịu nhất mà không phá vỡ mã hiện có, hoặc có những thành kiến ​​lẻ. Nói chung, việc tổng quát (++) không thể thực hiện theo cách làm cho các thư viện in đẹp đẹp do mức ưu tiên, và nó có ý nghĩa khác trước khi có 98, khi nó được sử dụng cho những gì chúng ta gọi mplus ngay bây giờ. Nếu chúng ta tránh những thứ có ý nghĩa bằng các ngôn ngữ khác, chúng ta sẽ không còn người điều khiển nào nữa! Các toán tử <<, >>, -,!,%,: Vv tất cả đều có ngữ nghĩa khác trong các ngôn ngữ khác. –

+0

Lạ, tôi đang cố gắng sử dụng nó nhưng nhận được 'Không nằm trong phạm vi:‘ <> ’'. GHC 7.10.3 – klappvisor

1

Chỉ cần sử dụng mconcat cho tất cả các loại monoids. Bạn không cần nhập bất kỳ thứ gì và mã trông sạch sẽ hơn nhiều.

dụ:

{-# LANGUAGE OverloadedStrings #-} 

import   Data.Text 

table :: Text 
table = "user" 

fields :: [Text] 
fields = ["id","nickname","password","date","posts","comments"] 

insertquery :: Text -> [Text] -> Text 
insertquery table fields = mconcat 
    ["insert into ",table," (",names,") values (",vals,");"] 
    where 
    names = insertcomma fields 
    vals = insertcomma [singleton '?' | _ <- fields] 
    insertcomma = intercalate (singleton ',') 

và kết quả nó mang lại:

lĩnh vực bảng

λ> insertquery

"chèn vào sử dụng (id, biệt danh, mật khẩu, ngày tháng, bài viết, ý kiến) giá trị (?,?,?,?,?,?); "

+0

Tôi không chắc mình đồng ý 'mconcat [...]' tốt hơn '<>', đặc biệt khi có chỉ có hai hoặc ba giá trị để kết hợp. Nhưng nó chắc chắn là một lựa chọn đáng xem xét cho các kết nối lớn hơn như ví dụ của bạn. – leftaroundabout

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