【发布时间】:2016-10-02 09:17:43
【问题描述】:
作为定义语言解释器的一部分,我有以下定义:
initCtx :: Context
initCtx = (Map.empty, initEnv)
where initEnv =
Map.fromList [ ...
, ("+", undefined)
...
]
对于求和运算,我有这个:
evalExpr :: Expr -> Interpreter Value
evalExpr (e1 :+: e2) = do v1 <- eval e1
v2 <- eval e2
return Interpreter $ (v1 + v2)
exalExpr 是我做的,但是我需要写什么来代替undefined 以便执行表达式?或者,也许,我正在寻找错误的东西?我当然有更多的操作,但我只需要一个例子。我对 Haskell 很陌生,实际上我需要处理它。
谢谢!
编辑:
type Env = Map Ident Value
type Primitive = [Value] -> Interpreter Value
type PEnv = Map FunName Primitive
type Context = (Env, PEnv)
这里是Expr:
data Expr = Number Int
| String String
| Array [Expr]
| Undefined
| TrueConst
| FalseConst
| Var Ident
| Compr ArrayFor Expr
| Call FunName [Expr]
| Assign Ident Expr
| Comma Expr Expr
deriving (Eq, Read, Show)
还有Interpreter
newtype Interpreter a = Interpreter {runInterpreter :: Context -> Either Error (a, Env)}
和价值:
data Value = IntVal Int
| UndefinedVal
| TrueVal | FalseVal
| StringVal String
| ArrayVal [Value]
deriving (Eq, Show)
【问题讨论】:
-
这是一个让你得到 A、B、C 并告诉你去实现 X、Y、Z 的练习吗?还是你自己设计整个东西?
-
@MathematicalOrchid 这是一个练习,是的
-
你能具体告诉我们你得到了哪些比特,它们应该是什么意思吗? (例如,看起来
Context是一对地图 - 但这些地图应该表示是什么意思?:+:来自哪里?) -
公平地说,“编写解释器”将是 C# 或 Java 中的一项重大任务。但在 Haskell 中,这是一个小的初学者练习。也许 那 是人们认为 Haskell 是一种“硬语言”的原因。 ;-)
-
如果
(+)在环境中,您可能需要定义evalExpr (e1 :+: e2),而不是使用Haskell+,而是从环境中获取+的含义。所以,像Intepreter $ \ctx -> let plus = lookupEnv ctx "+" in ...这样的自定义lookupEnv。您还需要将函数添加到您的值中。
标签: haskell interpreter