[英]Haskell - arithmetic operations with datatypes
我正在编写自己的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作为回报,有什么想法吗?
通常,在这种情况下,您将编写“评估程序”或“解释程序”-接受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
您需要为数据构造函数的每种组合适当定义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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.