首页 > 解决方案 > 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)

标签: haskell

解决方案


存在许多问题,但编译器目前正在抱怨您尝试定义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构造函数,所以这样使用它本身就是一个错误——该类型的构造函数被命名为BlattWertand AstOp

  5. 有时您使用RechenBaum和其他时间Rechenbaum- 这些是不同的符号。


推荐阅读