0

我收到一个匹配错误:

表达式:parseExpr (append pe) es

术语:parseExpr

类型:Expr -> 字符串

不匹配: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 对象定义中的字符串。有没有办法说明这一点?

4

1 回答 1

1

也许你的困惑就在这里:

data Expr = ... | Expr String

这并不意味着 everyExpr都可以转换为字符串。它只是意味着有一个函数被调用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将带有空格的字符串连接在一起?一个具体的例子会有所帮助。

于 2014-11-22T14:01:05.147 回答