我有一些坏的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) ++ ["\""])'
任何想法如何正确解决此问题?
答案 0 :(得分:3)
您遇到了问题,因为(++)
在列表([]
上进行操作,而String
仅是[Char]
,而Text
不是。
幸运的是,有一个来自Monoid
类的通用追加操作符,称为(<>)
。因此,正如@ 4castle所说,只需使用"\"" <> pgaName a <> "\""
来连接Text
。