我编译时在Haskell代码上收到此错误消息:
H5-1.hs:11:28: error:
parse error on input ‘=’
Perhaps you need a 'let' in a 'do' block?
e.g. 'let x = 5' instead of 'x = 5'
|
11 | show (Blattwert(a))= "show a" |
这是原始代码:
class ToDouble a
where toDouble :: a -> Double
我该如何解决这个问题?
data Op = Plus | Minus | Mal | Geteilt
deriving (Show, Eq)
data RechenBaum = BlattWert Double | AstOp RechenBaum Op RechenBaum
deriving Show
instance ToDouble (RechenBaum) where
show (Blattwert(a))= "show a"
toDouble(AstOp (Rechenbaum (a) Op(b) Rechenbaum(c)))=
ToDouble (AstOp (Rechenbaum (a) Op(Plus) Rechenbaum(c)))= RechenBaum(a)+ Rechenbaum(c)
ToDouble (AstOp (Rechenbaum (a) Op(Minus) Rechenbaum(c)))= RechenBaum(a) - Rechenbaum(c)
ToDouble (AstOp (Rechenbaum (a) Op(Mal) Rechenbaum(c)))= RechenBaum(a)*Rechenbaum(c)
ToDouble (AstOp (Rechenbaum (a) Op(Geteilt) Rechenbaum(c)))= RechenBaum(a) /Rechenbaum(c)
答案 0 :(得分:3)
存在许多问题,但编译器目前正在抱怨您尝试定义show
:
instance ToDouble (RechenBaum) where
show (Blattwert(a))= "show a"
函数show
不是类ToDouble
的成员,因此您无法在ToDouble
实例的where块中定义它。
您正在使用一些奇怪的语法进行模式匹配。不要Rechenbaum(a)
而是(Rechenbaum a)
。编辑:Rechenbaum甚至不是一个构造函数,所以不要这样使用它。如果您想要一个匹配任何构造函数的变量,请使用a
或模式匹配其中一个构造函数。您使用的Op
也不是构造函数。
没有名为ToDouble
的数据构造函数,因此您在实例中定义toDouble
根本就没有意义。
构造函数RechenBaum
将生成RechenBaum
类型的值,而不是Double
,因此在toDouble
的右侧使用它并不会RechenBaum
。很有道理。实际上,现在我看起来没有BlattWert
构造函数,因此使用它本身就是一个错误 - 该类型的构造函数被命名为AstOp
和RechenBaum
。
有时您使用Rechenbaum
,有时使用{{1}} - 这些是不同的符号。