Haskell错误如何解决它

时间:2018-05-17 19:54:20

标签: haskell

我编译时在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)

1 个答案:

答案 0 :(得分:3)

存在许多问题,但编译器目前正在抱怨您尝试定义show

instance ToDouble (RechenBaum) where
    show (Blattwert(a))= "show a"
  1. 函数show不是类ToDouble的成员,因此您无法在ToDouble实例的where块中定义它。

  2. 您正在使用一些奇怪的语法进行模式匹配。不要Rechenbaum(a)而是(Rechenbaum a)。编辑:Rechenbaum甚至不是一个构造函数,所以不要这样使用它。如果您想要一个匹配任何构造函数的变量,请使用a或模式匹配其中一个构造函数。您使用的Op也不是构造函数。

  3. 没有名为ToDouble的数据构造函数,因此您在实例中定义toDouble根本就没有意义。

  4. 构造函数RechenBaum将生成RechenBaum类型的值,而不是Double,因此在toDouble的右侧使用它并不会RechenBaum。很有道理。实际上,现在我看起来没有BlattWert构造函数,因此使用它本身就是一个错误 - 该类型的构造函数被命名为AstOpRechenBaum

  5. 有时您使用Rechenbaum,有时使用{{1}} - 这些是不同的符号。