Haskell-应用程序中的类型错误:类型不匹配

Haskell-应用程序中的类型错误:类型不匹配,haskell,functional-programming,pattern-matching,hugs,Haskell,Functional Programming,Pattern Matching,Hugs,我收到一个匹配错误: 表达式:parsexpr(append p e)es 术语:parsexpr 类型:Expr->String 不匹配: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 -&

我收到一个匹配错误:

表达式:parsexpr(append p e)es

术语:parsexpr

类型:Expr->String

不匹配: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

尽管e总是来自我上面提到的Expr对象定义的字符串。有没有办法说明这一点?

也许你的困惑在于:

data Expr = ... | Expr String
这并不意味着每个
Expr
都可以转换为字符串。这只是意味着有一个名为
Expr
的函数,它接受
字符串
,并返回
Expr
(类型)

Pred
案例定义
parsexpr
的明显方法是在
Expr
列表的元素上调用
parsexpr
,例如:

parseExpr (Pred p exprs) = 
    let strs = map parseExpr exprs  -- this is a [String]
        s    = concat strs          -- this is a String
    in p ++ s

也许您希望
s=interlate”strs
用空格将字符串连接在一起?一个具体的例子会很有帮助。

错误信息对我来说已经足够清楚了
parseExpr
的类型为
Expr->String
,但您使用两个参数调用它。in
parseExpr(Pred p(e:es))=…
p
将是
String
e
将是
Expr
,而
es
将是
[Expr]/code>。为什么你认为
e
将是一个
String
?@user5402因为我猜Expr总是可以分解成一个字符串?对不对?我正在尝试为Expr执行toString。不过,
parsexpr
只接受一个参数。但是在
parsexpr(append p e)es
中,您使用两个参数调用它。这行不通……请安装
ghc
并永远卸载
hugs