Haskell迷你口译员

时间:2019-06-04 20:54:54

标签: haskell interpreter

因此,我们的教授向我们提供了此代码和有关此问题的两个问题。我根本不知道从哪里开始,因为我不理解所提供的任何代码,因此仅了解所有这些行的内容是一个好的开始。

我知道data是声明数据类型,而|充当Or。

但是对于其他所有内容,例如Lambda String Exp, 是String还是匿名函数?Exp是预定义的值吗? VLambdaVVar应该是什么? 每行的解释都很棒。 谢谢您的时间:)

以下是一些Haskell代码,可作为功能性迷你语言的解释器:

-- The expressions

data Exp = Var String
   | Lambda String Exp
   | App Exp Exp

-- The values returned by the interpreter

data Value = VVar String
   | VLambda String Exp
type Env = [(String, Value)]

-- The interpreter

eval :: Env -> Exp -> Value
eval env e = ...
  1. eval函数将使用哪个作用域?
  2. 为了允许其他范围,我们必须更改什么?

所引用的范围是动态或静态(词法)范围

1 个答案:

答案 0 :(得分:3)

这里有很多问题,每条帖子问一个特定问题时,StackOverflow效果更好。无论如何,这是一个开始:

  

Lambda String Exp,是字符串还是匿名函数

这是一个非特殊名称“ Lambda”的值,其中包含一个String和一个Exp。相当于这个Java类:

class Lambda extends Exp {
  String variable;
  Exp expression;
}

它以解释语言表示匿名函数表达式。

  

Exp是预定义的值吗?

否,它是在您的代码段data Exp = ...

中定义的
  

VLambda和VVar应该是什么?

解释器对表达式和结果值使用不同的类型,因此Lambda表达式将求值为VLambda值,而Var表达式将求值为{{1} }或Value(如果免费)(可能是免费的)。在获得VVar

之前,将对App表达式进行求值。
  

eval函数将使用哪个作用域?

Value函数将使用动态范围评估语言。您可以知道,因为VLambda没有可以存储闭包的Env字段。

  

为了允许其他范围,我们必须更改什么?

您需要在VLambda中添加一个Env字段,该字段将在评估Lambda时存储词法变量的闭包。