Я работаю с древовидной структурой, и у меня есть следующие строки кода, но я не понимаю, в чем причина проблемы.Моя функция reshapeTree принимает AST и Mapping в качестве аргументов и возвращает AST.Я действительно не знаю, что вызывает эту ошибку, и был бы признателен, если бы вы могли помочь. Спасибо
Я получаю следующую ошибку, и мой код ниже:
test1.hs:55:35: error:
* Couldn't match type <code>[Char]' with</code>AST'
Expected type: [(String, AST, String)]
Actual type: Mapping
* In the second argument of <code>reshapeTree', namely</code>mapping'
In the expression: reshapeTree tree mapping
In an equation for `newTree': newTree = reshapeTree tree mapping
|
55 | where newTree = reshapeTree tree mapping
| ^^^^^^^</p>
<code>type Mapping = [(String, String, String)]
data AST = EmptyAST | ASTNode String AST AST deriving (Show, Read)
reshapeTree (EmptyAST) (_) = EmptyAST
reshapeTree (ASTNode val l r) [] = (ASTNode val l r)
reshapeTree (ASTNode val l r) [(v1,v2,v3)]
|val == v1 = (ASTNode v3 v2 EmptyAST)
|otherwise = (ASTNode val (reshapeTree l [(v1,v2,v3)]) (reshapeTree r [(v1,v2,v3)]))
reshapeTree (ASTNode val l r) ((v1,v2,v3):xs)
|val == v1 = (ASTNode v3 v2 EmptyAST)
|otherwise = reshapeTree (ASTNode val (reshapeTree l ((v1,v2,v3):xs)) (reshapeTree r ((v1,v2,v3):xs))) xs
evalTree (ASTNode val l r)
|val == "plus" = show (read (evalTree l) + read (evalTree r) )
|val == "times" = show (read (evalTree l) * read (evalTree r) )
|val == "cat" = (evalTree l) ++ (evalTree r)
|val == "negate" = show ((-1) * read (evalTree l))
|val == "len" = show (length(evalTree l))
|val == "str" = evalTree l
|val == "num" = evalTree r
|otherwise = val
evaluateAST (tree,mapping)
|mapping == [] = (tree,evalTree tree)
|otherwise = (tree, evalTree newTree)
where newTree = reshapeTree tree mapping
</code>