我聽說Data.Text
將在未來的Haskell版本中替換String
s。我遇到的一個問題是(++)
僅爲列表定義。要連接兩個Text
s,我需要使用沒有`mappend`連接兩個Data.Texts的標準方式
text1 `mappend` text2
其中快速得到詳細。理想情況下,我希望能夠在這些Text
上使用++
,但如果沒有,那麼另一種選擇是什麼?我可以定義自己的中綴運算符,但我希望採用這種標準方法。
我聽說Data.Text
將在未來的Haskell版本中替換String
s。我遇到的一個問題是(++)
僅爲列表定義。要連接兩個Text
s,我需要使用沒有`mappend`連接兩個Data.Texts的標準方式
text1 `mappend` text2
其中快速得到詳細。理想情況下,我希望能夠在這些Text
上使用++
,但如果沒有,那麼另一種選擇是什麼?我可以定義自己的中綴運算符,但我希望採用這種標準方法。
從GHC 7.4(不確定哪個點版本)有一個預定義的<>
運算符,它的工作原理與mappend
相同。所以你可以說
text1 <> text2
所以這就是「標準」中綴操作符,但它到處都不可用。
只需使用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,暱稱,密碼,日期,帖子,評論)值 (?,?,?,?,?,?);「
我不確定我同意'mconcat [...]'比'<>'更好,尤其是當有隻有兩個或三個值合併。但它絕對是一個值得考慮的選擇,就像你的例子那樣需要更大的連接。 – leftaroundabout 2016-09-27 15:11:03
這是一個不好名稱的運營商。 '<>'具有「不等於」的語義。推廣'++'來處理所有的Monoid會更好。 – 2012-04-01 20:49:57
<>被選中是因爲它已經被具有monoidal語義的漂亮的打印庫所使用,並且它是不會破壞現有代碼的最不顯眼的選項,或者具有奇怪的偏見。另一方面,泛化(++),由於其優先級而無法以漂亮的漂亮打印庫的方式完成,而且它在haskell 98之前有另一個含義,當它用於我們的現在打電話給mplus。如果我們避免使用其他語言的含義,我們將不會有任何操作員離開!運算符<<, >>, - ,!,%,:等在其他語言中也都有其他語義。 – 2012-04-03 01:08:58
奇怪的是,我試圖使用它,但得到'不在範圍:'<>''。 GHC 7.10.3 – klappvisor 2016-06-06 17:37:44