2016-03-31 3 views
1

Чтобы получить награды за курс, мне поручено воссоздать задание, которое мы завершили в 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 

Я имею очень трудное время, выясняя правильный синтаксис для этих определений. Пожалуйста, ответьте на любые подсказки, которые помогут мне добиться прогресса в этом. Помня о том, что это для честных кредитов - я не ожидаю каких-либо полных решений, а просто некоторую помощь (не то, чтобы я отклонил решения).

+0

Не путайте тип с его конструктором данных. Например, 'Env" Foo "" Bar "создает значение типа' Env String', в то время как (предполагается, что 9 - это 'Int' для целей этого примера), строка« Env »« 9 »создает значение типа' Env Int'. Подумайте, как это влияет на вашу попытку определения 'envNew'. – chepner

+0

'тип Env a = String -> a' был слишком очевиден, я думаю. (Ваш тип Haskell будет соответствовать 'datatype 'a Env = Env строки *' a' в SML.) – molbdnilo

ответ

3
data Env a = Env String a 

Это не тот тип, что и у ML: стрелки выше нет. Вы хотите

data Env a = Env (String -> a) 

Затем

envNew :: a -> Env a 
envNew a = Env a 

это не имеет такого же типа, как и в ML! Исправьте это.

Кроме того,

envBind :: Env a -> String -> a -> Env a 
envBind environment name value = Env name value 

мало смысла: она даже не использовать окружающую среду. Начните с определения в ML, которое у вас есть, и попытайтесь подражать этому.

Смежные вопросы