Haskell,无法匹配预期类型

Haskell,无法匹配预期类型,haskell,types,match,Haskell,Types,Match,我是哈斯克尔的新手,我不知道出了什么问题 data Stmt = If BExpr Stmt | While BExpr Stmt | Assign String AExpr deriving (Eq, Show) printStmt :: Stmt -> String printStmt (If e, s1) = "if " ++ (printBExpr e) ++ " {" ++ (printStmt s1) ++ "

我是哈斯克尔的新手,我不知道出了什么问题

data Stmt = If BExpr Stmt
      | While BExpr Stmt
      | Assign String AExpr
      deriving (Eq, Show)
printStmt :: Stmt -> String
printStmt (If e, s1)                = "if " ++ (printBExpr e) ++ " {" ++ (printStmt s1) ++ " }"
printStmt (While e, s)              = "while" ++ (printBExpr e) ++ "{" ++ (printStmt s) ++ "}"
printStmt (Assign s, e)             = s ++ ":=" ++ (printAExpr e)

有人能告诉我这里哪里出现“无法匹配预期类型”错误吗?

从模式中删除逗号:

printStmt :: Stmt -> String
printStmt (If e s1)         = "if " ++ (printBExpr e) ++ " {" ++ (printStmt s1) ++ " }"
printStmt (While e s)       = "while" ++ (printBExpr e) ++ "{" ++ (printStmt s) ++ "}"
printStmt (Assign s e)      = s ++ ":=" ++ (printAExpr e)

(如果e,s1)
被解释为一对(两元组)。

假设您对
printBExpr
printAExpr
的定义正确,您需要删除模式匹配中的逗号:

printStmt (If e s1)
printStmt (While e s)
printStmt (Assign s e)