Haskell-应用程序中的类型错误:类型不匹配
我收到一个匹配错误: 表达式:parsexpr(append p e)es 术语:parsexpr 类型:Expr->String 不匹配:a->b->c 当我尝试在标记行中执行此代码时: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 -&
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
,但您使用两个参数调用它。inparseExpr(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
。