Стандартный способ соединения двух Data.Texts без `mappend`
Я слышал, что Data.Text
заменит String
в будущих версиях Haskell. Одна из проблем, с которыми я столкнулась, заключается в том, что (++)
определяется только для списков. Чтобы соединить два Text
s, мне нужно использовать
text1 `mappend` text2
Быстрое получение. В идеале я бы хотел использовать ++
для этих Text
s, но если нет, то какая альтернатива? Я мог бы определить свой собственный инфиксный оператор, но мне бы хотелось, чтобы это было стандартным способом.
Ответы
Ответ 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, псевдоним, пароль, дату, сообщения, комментарии) значения (,,,?????);"