Подтвердить что ты не робот

Стандартный способ соединения двух Data.Texts без `mappend`

Я слышал, что Data.Text заменит String в будущих версиях Haskell. Одна из проблем, с которыми я столкнулась, заключается в том, что (++) определяется только для списков. Чтобы соединить два Text s, мне нужно использовать

text1 `mappend` text2

Быстрое получение. В идеале я бы хотел использовать ++ для этих Text s, но если нет, то какая альтернатива? Я мог бы определить свой собственный инфиксный оператор, но мне бы хотелось, чтобы это было стандартным способом.

4b9b3361

Ответ 1

Из GHC 7.4 (не уверен, какой точечной версии) существует предопределенный оператор <>, который работает так же, как mappend. Таким образом, вы сможете сказать

text1 <> text2

Итак, что "стандартный" инфиксный оператор, но он пока недоступен.

Ответ 2

Просто используйте 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, псевдоним, пароль, дату, сообщения, комментарии) значения (,,,?????);"