haskell 如何为计算器声明类?

gmxoilav  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(147)

我正在尝试用Haskell的类声明来构建我自己的计算器。
首先,我试图实现加法,但在这里我得到了错误:
无法将预期类型“Exp -〉Double”与实际类型“Exp”匹配

data Exp = Number Double | Add Exp Exp 

class Calc a where
 calculate :: a -> a -> Double

instance Calc Exp where
 calculate (Add a b) = a + b

我需要改变什么?

ippsafx7

ippsafx71#

在这里,您实际上并不需要,我也不推荐使用类,只需要定义一个普通函数,分别处理每个数据构造函数即可(只有当您希望有多个 types 可用于calculate时,才使用类)。
在这两种情况下,calculate都接受一个 single 参数,因为您的类型表示整个表达式、操作数和运算符。

calculate :: Exp -> Double
calculate (Number n) = ...
calculate (Add a b) = ...

请记住,abExp类型的值,而不是可以直接相加的数字(例如,具有Num示例的类型)(这意味着在实际执行加法之前,需要 * 递归地 * 计算ab的值)。
您需要考虑的一些测试案例:

n1 = Number 2.0
n2 = Add (Number 3.0) (4.0))
n3 = Add n1 n2

map calculate [n1, n2, n3] == [2.0, 7.0, 9.0]
z4bn682m

z4bn682m2#

正如chepner所建议的,calculate函数只需要一个参数,还需要考虑每个Exp值都是Number的可能性,并在函数中进行处理。
由于abExp值,而不是Num示例,因此需要将calculate应用于它们。

data Exp = Number Double | Add Exp Exp 

class Calc a where
 calculate :: a -> Double

instance Calc Exp where
 calculate (Number n) = n
 calculate (Add a b) = a' + b'
  where a' = ...
  where b' = ...

但是你可以考虑把Exp作为Num的一个示例,下面的内容是不完整的,因为它没有考虑除了+之外的实际表达式,但是它可能暗示了什么是可能的。
x一个一个一个一个x一个一个二个x

相关问题