加入两个没有`mappend`的Data.Texts的标准方法

时间:2012-04-01 08:41:39

标签: haskell

我听说Data.Text将在未来的Haskell版本中替换String。我遇到的一个问题是(++)仅为列表定义。要连接两个Text,我需要使用

text1 `mappend` text2

很快就会变得冗长。理想情况下,我希望能够在这些++上使用Text,但如果没有,那么另一种选择是什么?我可以定义自己的中缀运算符,但我想要一种标准的方法来实现这一点。

2 个答案:

答案 0 :(得分:17)

从GHC 7.4(不确定哪个版本),有一个预定义的<>运算符与mappend的运算方式相同。所以你可以说

text1 <> text2

这就是“标准”中缀运算符,但它还没有到处都可用。

答案 1 :(得分:1)

只需使用mconcat即可获得所有类型的幺半群。你不需要导入任何东西,代码看起来更干净。

示例:

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

及其给出的结果:

  

λ&GT; insertquery表字段

     

“插入用户(ID,昵称,密码,日期,帖子,评论)值   (,,,,,??????);“