2012-04-01 10 views
13

Data.Textは今後のHaskellバージョンでStringを置き換えると聞いています。私がこれを持っている1つの問題は、リストのためだけに(++)が定義されていることです。 2つのText Sを連結するために、私はすぐにVERBOSEます2つのData.Textをmappendなしで結合する標準的な方法

text1 `mappend` text2 

を使用する必要があります。理想的にはText++を使用したいと思っていますが、そうでなければ何が別の選択肢ですか?私は自分自身の中置演算子を定義することができますが、これを行う標準的な方法が欲しいです。

答えて

17

GHC 7.4(どの点のバージョンがわからないか)から、mappendと同じ働きをする定義済みの<>演算子があります。したがって、あなたは言うことができるでしょう

text1 <> text2 

これは「標準的な」中置演算子ですが、まだ利用できません。

+1

これは不適切な名前の演算子です。 '<>'は "not equal"と同じ意味を持ちます。全てのモノイドを扱うには '++'を一般化する方がいいでしょう。 –

+8

<>が選択されました。なぜなら、monoidalセマンティクスを備えたかなりの印刷ライブラリと、既存のコードを破らない、または奇妙な偏りを持つ最も目障りなオプションが既に使用されていたからです。一方、一般化(++)は、優先レベルのためにきれいな印刷ライブラリを作成する方法では行えません。また、haskell 98の前には別の意味がありました。今すぐmplusを呼び出してください。私たちが他の言語で意味を持つものを避ければ、演算子は残っていません! <<, >>、 - 、!、%、:などの演算子は、他の言語でも他のセマンティクスを持っています。 –

+0

奇妙な、私はそれを使用しようとしていますが、スコープ内にはない: '<>' '。 GHC 7.10.3 – klappvisor

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

、結果はそれができます:

λ> insertqueryテーブルのフィールド

「は、ユーザ(ID、ニックネーム、パスワード、日付、投稿、コメント挿入)値 (?、?、?、?、?、?); "

+0

特に、 'mconcat [...]'が '<>'より優れているとは思えません。結合するのは2つまたは3つの値だけです。しかし、それはあなたの例のようなより大きな連結のために考慮する価値のある選択肢です。 – leftaroundabout

関連する問題