我在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
但这绝对不正确。
答案 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