【发布时间】:2015-01-21 09:39:34
【问题描述】:
我有一个字符串列表,我试图在以下代码中的列表末尾添加一个字符串,但出现类型匹配错误:
eliminateImpl :: [String] -> String -> [String]
eliminateImpl [] _ = []
eliminateImpl (p:ps) r = if (contains (p:ps) "Impl")
then if (p == "Impl" )
then "Not " ++r++" Or "++ps -- TRYING TO CONCATENATE HERE
else let r = r++p
in eliminateImpl ps r
else (p:ps)
contains :: [String] -> String -> Bool
contains [_] [] = True
contains [] _ = False
contains (p:ps) c = if p == c
then True
else contains ps c
代码实际上做的是函数 eleminateImpl 采用一阶逻辑表达式,例如:“eliminateImpl [”Q(y)","Impl","P(x)"] []" 它应该删除蕴涵并修改表达式,使输出为:"eliminateImpl ["Not", "Q(y)"," Or ","P(x)"]
我尝试了 r++p 和 r:p 但两者都不起作用。这是错误:
无法将“Char”类型与“[Char]”匹配
Expected type: [String] Actual type: [Char] In the first argument of ‘(++)’, namely ‘"Not "’ In the expression: "Not " ++ r ++ " Or " ++ ps In the expression: if (p == "Impl") then "Not " ++ r ++ " Or " ++ ps else let r = r ++ p in eliminateImpl ps r
还有其他方法吗?
【问题讨论】:
-
之后的字符串列表应该是什么样子?
-
你能解释一下你不想做什么吗?我似乎无法理解你写的内容。
-
@SebastianRedl 函数应该得到一个一阶逻辑表达式,例如:"eliminateImpl ["Q(y)","Impl","P(x)"] []" 和函数应该删除隐含并修改表达式,使输出为:"eliminateImpl ["Not", "Q(y)"," Or ","P(x)"]"
-
您想在这一行中将 ++ 替换为 :
-
应该替换所有出现的“impl”还是只替换一个?