2012-04-01 29 views
13

我聽說Data.Text將在未來的Haskell版本中替換String s。我遇到的一個問題是(++)僅爲列表定義。要連接兩個Text s,我需要使用沒有`mappend`連接兩個Data.Texts的標準方式

text1 `mappend` text2 

其中快速得到詳細。理想情況下,我希望能夠在這些Text上使用++,但如果沒有,那麼另一種選擇是什麼?我可以定義自己的中綴運算符,但我希望採用這種標準方法。

回答

17

從GHC 7.4(不確定哪個點版本)有一個預定義的<>運算符,它的工作原理與mappend相同。所以你可以說

text1 <> text2 

所以這就是「標準」中綴操作符,但它到處都不可用。

+1

這是一個不好名稱的運營商。 '<>'具有「不等於」的語義。推廣'++'來處理所有的Monoid會更好。 – 2012-04-01 20:49:57

+8

<>被選中是因爲它已經被具有monoidal語義的漂亮的打印庫所使用,並且它是不會破壞現有代碼的最不顯眼的選項,或者具有奇怪的偏見。另一方面,泛化(++),由於其優先級而無法以漂亮的漂亮打印庫的方式完成,而且它在haskell 98之前有另一個含義,當它用於我們的現在打電話給mplus。如果我們避免使用其他語言的含義,我們將不會有任何操作員離開!運算符<<, >>, - ,!,%,:等在其他語言中也都有其他語義。 – 2012-04-03 01:08:58

+0

奇怪的是,我試圖使用它,但得到'不在範圍:'<>''。 GHC 7.10.3 – klappvisor 2016-06-06 17:37:44

1

只需使用mconcat即可適用於所有類型的monoids。你不需要導入任何東西,代碼看起來更乾淨。

例如:

{-# 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 ',') 

,結果它給:

λ> insertquery表字段

「插入用戶(ID,暱稱,密碼,日期,帖子,評論)值 (?,?,?,?,?,?);「

+0

我不確定我同意'mconcat [...]'比'<>'更好,尤其是當有隻有兩個或三個值合併。但它絕對是一個值得考慮的選擇,就像你的例子那樣需要更大的連接。 – leftaroundabout 2016-09-27 15:11:03

相關問題