我收到了匹配错误:
Expression:parseExpr(append p e)es
术语:parseExpr
类型:Expr - >串
不匹配:a - > b - > ç
当我尝试在标记的行中执行此代码时:
data Expr = Atom String | Var String | Pred String [Expr] | Expr String
append :: String -> String -> String
append a b = a++b
parseExpr :: Expr -> String
parseExpr (Atom a) = a
parseExpr (Var x) = x
parseExpr (Pred p (e:es)) = parseExpr (append p e) es -- ERROR HERE
虽然e总是来自我上面提到的Expr对象定义的String。有没有办法说明这个?
答案 0 :(得分:1)
也许你的困惑在这里:
data Expr = ... | Expr String
这并不意味着每个Expr
都可以转换为字符串。它只是意味着有一个名为Expr
的函数,它接受String
并返回Expr
(类型)。
为parseExpr
案例定义Pred
的明显方法是在parseExpr
列表的元素上调用Expr
,例如:
parseExpr (Pred p exprs) =
let strs = map parseExpr exprs -- this is a [String]
s = concat strs -- this is a String
in p ++ s
也许您希望s = intercalate " " strs
将字符串与空格连接在一起?一个具体的例子会有所帮助。