【问题标题】:Haskell - arithmetic operations with datatypesHaskell - 数据类型的算术运算
【发布时间】:2017-10-16 22:51:52
【问题描述】:

我正在编写自己的 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 作为回报,有什么想法吗?

【问题讨论】:

  • 你尝试的时候发生了什么?
  • Sum (Value 3) (Value 5)总是,根据定义,是Expr 类型的不同值;你不能把它减少到8,因为8不是Expr的构造函数。

标签: haskell


【解决方案1】:

通常,在这种情况下,您会编写一个“评估器”或“解释器”——一个接受 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

【讨论】:

    【解决方案2】:

    您需要为每个数据构造函数组合适当地定义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    
    

    【讨论】:

      猜你喜欢
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2022-01-13
      • 2012-04-16
      相关资源
      最近更新 更多