2014-11-22 124 views
0

我得到一個匹配錯誤:哈斯克爾 - 類錯誤應用:類型不匹配

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 

儘管電子始終將成爲我上面陳述的Expr對象定義中的一個字符串。有沒有辦法說明這一點?

+3

錯誤消息似乎對我來說足夠清晰。 'parseExpr'的類型是'Expr - > String',但是你用兩個參數來調用它。在'parseExpr(Pred p(e:es))= ...'中, – kosmikus 2014-11-22 13:03:29

+0

=''p'將成爲'String','e'將成爲'Expr','es'將成爲'[Expr]'。你爲什麼認爲'e'會是一個'String'? – ErikR 2014-11-22 13:19:22

+0

@ user5402因爲Expr總是可以細分爲一個字符串,我猜?這不正確嗎?我正在嘗試爲Expr執行toString。 – SalmaFG 2014-11-22 13:23:48

回答

1

也許你的困惑是在這裏:

data Expr = ... | Expr String 

這並不意味着每一個Expr可以轉換爲字符串。這隻意味着有一個函數叫做Expr,它需要String並返回一個Expr(類型)。

定義parseExprPred情況下,顯而易見的方法是呼籲Expr列表的元素parseExpr,例如:

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與空間結合在一起的琴絃?一個具體的例子會有幫助。