2014-11-22 1 views
0

Я получаю ошибку соответствия:Haskell - Тип ошибки в применении: Тип не соответствует

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 

Хотя е всегда будет String из определения объекта Expr, о котором я говорил выше. Есть ли способ заявить об этом?

+3

Сообщение об ошибке кажется достаточно ясным для меня. 'parseExpr' имеет тип' Expr -> String', но вы вызываете его с двумя аргументами. – kosmikus

+0

в 'parseExpr (Pred p (e: es)) = ...' 'p' будет' String', 'e' будет' Expr', а 'es' будет' [Expr] '. Почему вы думаете, что 'e' будет' String'? – ErikR

+0

@ user5402 Потому что Expr всегда можно разбить на String, я думаю? Разве это не так? Я пытаюсь выполнить toString для Expr. – SalmaFG

ответ

1

Возможно, ваша путаница здесь:

data Expr = ... | Expr String 

Это не означает, что каждый Expr может быть преобразован в строку. Это просто означает, что существует функция, называемая 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 объединиться строки с пробелами? Конкретный пример был бы полезен.