如何在Haskell中用引号将Text值包装

时间:2018-07-26 17:14:22

标签: haskell

我有一些坏的Haskell代码,并且以前从未听说过Haskell。

该代码正在生成数据库查询字符串,并且无法正确引用标识符。

所以我只想在标识符周围加上引号。

以下是现有代码:

(此部分在单独的文件中):

data PgArg = PgArg {
  pgaName :: Text
, pgaType :: Text
, pgaReq  :: Bool
} deriving (Show, Eq, Ord)

(然后在另一个文件中断开部分):

    unwords [
         "_args_record AS (",
         "SELECT * FROM " <> (if isObject then "json_to_record" else "json_to_recordset") <> "($1)",
         "AS _(" <> intercalate ", " ((\a -> pgaName a <> " " <> pgaType a) <$> pgArgs) <> ")",
     ")"]

我尝试了一些技巧,最终总结为:

    unwords [
         "_args_record AS (",
         "SELECT * FROM " <> (if isObject then "json_to_record" else "json_to_recordset") <> "($1)",
         "AS _(" <> intercalate ", " ((\a -> (["\""] ++ (pgaName a) ++ ["\""]) <> " " <> pgaType a) <$> pgArgs) <> ")",
     ")"]

所以基本上我只是改变了:

pgaName a

收件人:

(["\""] ++ (pgaName a) ++ ["\""])

-无论如何它都会失败,并且类型不匹配

error:
    * Couldn't match expected type `[Char]' with actual type `Text'
    * In the first argument of `(++)', namely `(pgaName a)'
      In the second argument of `(++)', namely `(pgaName a) ++ ["\""]'
      In the first argument of `(<>)', namely
        `(["\""] ++ (pgaName a) ++ ["\""])'

任何想法如何正确解决此问题?

1 个答案:

答案 0 :(得分:3)

您遇到了问题,因为(++)在列表([]上进行操作,而String仅是[Char],而Text不是。

幸运的是,有一个来自Monoid类的通用追加操作符,称为(<>)。因此,正如@ 4castle所说,只需使用"\"" <> pgaName a <> "\""来连接Text