2016-03-04 41 views
-2

我在Haskell中创建了一个可以执行简单的数学方程的小语言。在成立看起来像这样:log2Sim对于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

什么是不正确的?你会得到什么错误? – sclv

+0

不在范围内:数据构造函数Log' 失败,已加载模块:无。 – JMV12

回答

2

让我们总是EVAL,看看我们是否得到IntLit

喜欢的东西(不typechecked ...)

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