繁体   English   中英

Haskell-数据类型的算术运算

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM