我正在尝试用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
我需要改变什么?
ippsafx71#
在这里,您实际上并不需要,我也不推荐使用类,只需要定义一个普通函数,分别处理每个数据构造函数即可(只有当您希望有多个 types 可用于calculate时,才使用类)。在这两种情况下,calculate都接受一个 single 参数,因为您的类型表示整个表达式、操作数和运算符。
calculate
calculate :: Exp -> Double calculate (Number n) = ... calculate (Add a b) = ...
请记住,a和b是Exp类型的值,而不是可以直接相加的数字(例如,具有Num示例的类型)(这意味着在实际执行加法之前,需要 * 递归地 * 计算a和b的值)。您需要考虑的一些测试案例:
a
b
Exp
Num
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]
z4bn682m2#
正如chepner所建议的,calculate函数只需要一个参数,还需要考虑每个Exp值都是Number的可能性,并在函数中进行处理。由于a和b是Exp值,而不是Num示例,因此需要将calculate应用于它们。
Number
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
+
2条答案
按热度按时间ippsafx71#
在这里,您实际上并不需要,我也不推荐使用类,只需要定义一个普通函数,分别处理每个数据构造函数即可(只有当您希望有多个 types 可用于
calculate
时,才使用类)。在这两种情况下,
calculate
都接受一个 single 参数,因为您的类型表示整个表达式、操作数和运算符。请记住,
a
和b
是Exp
类型的值,而不是可以直接相加的数字(例如,具有Num
示例的类型)(这意味着在实际执行加法之前,需要 * 递归地 * 计算a
和b
的值)。您需要考虑的一些测试案例:
z4bn682m2#
正如chepner所建议的,
calculate
函数只需要一个参数,还需要考虑每个Exp
值都是Number
的可能性,并在函数中进行处理。由于
a
和b
是Exp
值,而不是Num
示例,因此需要将calculate
应用于它们。但是你可以考虑把Exp作为
Num
的一个示例,下面的内容是不完整的,因为它没有考虑除了+
之外的实际表达式,但是它可能暗示了什么是可能的。x一个一个一个一个x一个一个二个x