Haskell对Ints和Double执行算术运算

时间:2012-06-15 17:30:47

标签: math haskell

我最近一直在为基本编程语言编写一个解释器,一切都很顺利。但是有人可以告诉我关于添加双打支持的最佳方法。目前只支持Ints,但我也希望增加对双打的支持。

2 个答案:

答案 0 :(得分:4)

  

输入Env a = [[Var,a]]

这是一个类型的家庭。 Env Int是一个int环境,Env Double是一个双重环境,依此类推。这不是一种可以同时保持整数和双精度的类型,这可能就是你所需要的。

可以包含整数和双精度的类型可能如下所示:

data Val = IntNum Int | DoubleNum Double

然后您可以将您的环境设为

type Env = [ (Var, Val) ]

(我不知道你为什么在这里使用列表列表。)

您需要为IntNumDoubleNum个案分别定义算术运算(如果您的语言支持,也可能用于混合操作数)。

添加布尔值和列表非常简单,只需将另外几个案例添加到Val

您必须处理语言中出现的类型错误,因为它开始支持多种类型。我不认为这个简单的设计非常适合静态类型安全的语言。如果你想要,那么必须对设计进行重大调整。

答案 1 :(得分:2)

简单的答案是定义一个可以保存以太IntDouble s的变体类型,例如

data Value = Int Int
           | Double Double

并相应地修改Env和其他类型的定义:

type Env = [[(Var, Value)]]

data ValExpr = IVar Var
             | IVal Value
             ...

但如果您打算添加更多类型,我会考虑使用GADT s。

编辑:错字