Haskell - карта функций, которые используют одну и ту же карту

В настоящее время я пишу язык программирования на Haskell. Этот язык программирования похож на Factor, являясь языком конкатенативного стека. Однако, забравшись довольно далеко, я наткнулся на кирпичную стену: у меня есть Data.Map типа:

Map.Map String ([YodaVal] -> YodaVal, Int) Но мне нужны функции, хранящиеся в карте, чтобы использовать карту в качестве параметра, чтобы я мог сохранить среду при рекурсии, а также, возможно, разрешить рекурсивные определения функций и рекурсивные определения функций Haskell -> Yoda. Однако тогда тип будет выглядеть так:

type Env = Map.Map String ([YodaVal] -> Env -> [YodaVal] -> YodaVal, Int) Что, конечно же, расширяется до:

Map.Map String ([YodaVal] -> Map.Map String ... -> [YodaVal] -> YodaVal, Int)


person Christopher Dumas    schedule 01.09.2015    source источник
comment
Можете ли вы привести пример того, что вы пытаетесь сделать? - Думаю, есть более простое решение.   -  person ErikR    schedule 01.09.2015
comment
Вот обычный способ реализации интерпретатора в Haskell: stackoverflow.com/questions/16970431/ См. раздел" Оценка выражений ". Как насчет того, чтобы сделать это таким образом?   -  person ErikR    schedule 01.09.2015
comment
@ user5402, да, я подумал, что должно быть. Прошу прощения, если мой вопрос не был ясен, но указанный выше тип является типом моей переменной envirnoment. Я хочу иметь возможность передавать текущую переменную среду в функции в этой переменной envirnoment.   -  person Christopher Dumas    schedule 01.09.2015


Ответы (1)


Вы можете описать бесконечные типы с помощью newtype:

newtype Env = Env {getEnv :: Map String ([Val] -> Env -> [Val] -> Val, Int))}

Будет произведена проверка типов, и представление среды выполнения будет таким, как если бы оболочки не было.

person AJF    schedule 01.09.2015