Чтобы получить награды за курс, мне поручено воссоздать задание, которое мы завершили в ML (с использованием реализации SMLNJ), но вместо этого используем haskell. Целью здесь является создание типа данных среды, которая связывает значения со строками.Создание типа данных среды в Haskell
Объявление типа в ML является:
type 'a Env = string -> 'a;
Основные функции, созданные в env_new()
, которая создает пустую среду, и env_bind()
которая принимает окружающую среду, строка и значение и связывает строку со значением при возвращении новая среда.
тест, демонстрирующий функциональные возможности ML следующим образом:
- val e1 = env_new() : int Env;
val e1 = fn : int Env
- val e2 = env_bind e1 "a" 100;
val e2 = fn : int Env
- val e3 = env_bind e2 "b" 200;
val e3 = fn : int Env
- e1 "a";
uncaught exception NameNotBound
- e2 "a";
val it = 100 : int
- e3 "a";
val it = 100 : int
Моя текущая декларация этого типа в Haskell и связанных с ними функций:
data Env a = Env String a
envNew :: a -> Env a
envNew a = Env a
envBind :: Env a -> String -> a -> Env a
envBind environment name value = Env name value
Я имею очень трудное время, выясняя правильный синтаксис для этих определений. Пожалуйста, ответьте на любые подсказки, которые помогут мне добиться прогресса в этом. Помня о том, что это для честных кредитов - я не ожидаю каких-либо полных решений, а просто некоторую помощь (не то, чтобы я отклонил решения).
Не путайте тип с его конструктором данных. Например, 'Env" Foo "" Bar "создает значение типа' Env String', в то время как (предполагается, что 9 - это 'Int' для целей этого примера), строка« Env »« 9 »создает значение типа' Env Int'. Подумайте, как это влияет на вашу попытку определения 'envNew'. – chepner
'тип Env a = String -> a' был слишком очевиден, я думаю. (Ваш тип Haskell будет соответствовать 'datatype 'a Env = Env строки *' a' в SML.) – molbdnilo