Haskell Mini-Interpreter - PullRequest
       9

Haskell Mini-Interpreter

0 голосов
/ 04 июня 2019

Итак, наш проф представил нам этот код и два вопроса о нем.Я понятия не имею, с чего начать, потому что я не понимаю ни одного из представленного кода, поэтому просто понять, что делают все эти строки, - хорошее начало.

Я знаю, data должен объявлять типы данных, а | действует как Or.

Но для всего остального, такого как Lambda String Exp, это String илианонимная функция и является ли Exp предопределенным значением?Каковы VLambda и VVar должны быть?Идти с объяснением каждой строки было бы здорово.Спасибо за потраченное время:)

Вот код на 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 Ответ

3 голосов
/ 05 июня 2019

Здесь много вопросов в одном, и StackOverflow работает лучше, когда вы задаете один конкретный вопрос для каждого сообщения.В любом случае, вот начало:

Lambda String Exp, это строка или анонимная функция

Это значение с не специальным именем "Lambda", которое содержитString и Exp.Это эквивалент этого Java-класса:

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

Он представляет собой выражение анонимной функции в интерпретируемом языке.

является Exp предопределенным значением?

Нет, это определено прямо здесь, в вашем фрагменте, data Exp = ...

Кем должны быть VLambda и VVar?

Интерпретатор использует разные типы для выражения и результирующего значения, поэтому выражение Lambda будет преобразовано в значение VLambda, а выражение Var - в Value изокружающая среда или VVar, если это бесплатно (предположительно).Выражение App будет оцениваться до тех пор, пока вы не получите Value

Какая область будет использоваться функцией eval?

Функция eval будет оцениватьязык с динамической областью видимости.Вы можете сказать, потому что VLambda не имеет поля Env, которое могло бы хранить замыкание.

Что мы должны изменить, чтобы учесть другие области?

ВыЯ добавил бы поле Env к VLambda, которое будет хранить закрытие лексических переменных при оценке лямбды.

...