Haskell - 使用数据类型的算术运算

时间:2017-10-16 13:38:00

标签: haskell

我正在编写自己的haskell数据类型来解决整数的求和操作,但我不知道如何制作语义。

data Expr = Value Int
    | Sum Expr Expr

我试图这样做:

sum:: Expr -> Expr -> Int
sum a b = b + a
val:: Int -> Int
val a = a

我想写得像:

Sum (Value 3) (Value 5)

获得8作为回报,任何想法?

2 个答案:

答案 0 :(得分:4)

通常,在这种情况下,你会写一个"评估员"或者"翻译" - 单个函数,接受Expr并将其计算为值:

eval :: Expr -> Int

然后,你可以写:

> eval (Sum (Value 3) (Value 5))
8
>

Haskell的函数定义模式匹配使这非常优雅:

eval (Value x) = ...
eval (Sum e1 e2) = ...you'll need to use eval recursively here...

因此,您不是为Expr的每个组件编写多个函数,而是为每个组件编写一个函数,其中包含一个基于模式的定义

如果这是家庭作业,你可能想停在这里并尝试自己计算细节。如果不是,那么以下内容应该有效:

eval :: Expr -> Int
eval (Value x) = x
eval (Sum e1 e2) = eval e1 + eval e2

答案 1 :(得分:0)

您需要为每个数据构造函数组合适当地定义sum

sum :: Expr -> Expr -> Int
sum (Value x) (Value y) = x + y
sum (Sum a b) (Sum c d) = sum a b + sum c d
sum (Value x) (Sub a b) = x + sum a b
sum (Sum a b) (Value y) = sum a b + y

这可以简化;一种方法是使用辅助函数,首先将单个Expr减少为整数值。

value :: Expr -> Int
value (Value x) = x
value (Sum x y) = (value x) + (value y)

sum :: Expr -> Expr -> Int
sum x y = value x + value y