log2Sim在Haskell中使用小语言

时间:2016-03-04 20:03:23

标签: haskell

我在Haskell中创建了一种可以执行简单数学方程式的小语言。设置如下:

data E = IntLit Int
   | BoolLit Bool
   | Plus E E
   | Minus E E
   | Multiplies E E
   | Exponentiate E E
   | Equals E E
     deriving (Eq, Show)

我已经完成了所有这些工作,但现在我需要为E定义一个函数,如果可能的话,通过将日志带到基数2来保留表达式的真值。如果不可能,程序可能会中止(例如,使用非详尽模式例外)。

log2Sim :: E -> E

运行此示例应为

> log2Sim (IntLit 8)
IntLit 3

我是否需要将log2Sim E添加到定义的语言中,还是有其他方式?我试图像这样定义它:

log2Sim :: E -> E
log2Sim (Log a) = log2sim (eval a)
log2sim (IntLit x) = IntLit $ logBase 2 x

但这绝对不正确。

1 个答案:

答案 0 :(得分:2)

让我们总是评估是否得到IntLit

喜欢的东西(不是类似的......)

log2Sim :: E -> E
log2sim x = case (eval x) of
    IntLit i -> IntLit (logBase 2 i)
    x1 -> error $ "type error: can't take the log of a non-IntLit-valued expression: " ++ show x1