2014-11-22 61 views
0

我得到一个匹配错误:哈斯克尔 - 类错误应用:类型不匹配

Expression : parseExpr (append p e) es

Term : parseExpr

Type : Expr -> String

Does not match : a -> b -> c

当我尝试在标线执行此代码

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 

尽管电子始终将成为我上面陈述的Expr对象定义中的一个字符串。有没有办法说明这一点?

+3

错误消息似乎对我来说足够清晰。 'parseExpr'的类型是'Expr - > String',但是你用两个参数来调用它。在'parseExpr(Pred p(e:es))= ...'中, – kosmikus 2014-11-22 13:03:29

+0

=''p'将成为'String','e'将成为'Expr','es'将成为'[Expr]'。你为什么认为'e'会是一个'String'? – ErikR 2014-11-22 13:19:22

+0

@ user5402因为Expr总是可以细分为一个字符串,我猜?这不正确吗?我正在尝试为Expr执行toString。 – SalmaFG 2014-11-22 13:23:48

回答

1

也许你的困惑是在这里:

data Expr = ... | Expr String 

这并不意味着每一个Expr可以转换为字符串。这只意味着有一个函数叫做Expr,它需要String并返回一个Expr(类型)。

定义parseExprPred情况下,显而易见的方法是呼吁Expr列表的元素parseExpr,例如:

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与空间结合在一起的琴弦?一个具体的例子会有帮助。