2016-03-31 4 views
1

Afin d'obtenir un crédit d'honneur pour un cours, j'ai été chargé de recréer une tâche que nous avons terminée dans ML (en utilisant l'implémentation SMLNJ), mais en utilisant haskell à la place. L'objectif ici est de créer un environnement de type qui lie les valeurs aux chaînes.Création d'un type de données d'environnement dans Haskell

La déclaration de type en ML est:

type 'a Env = string -> 'a; 

Les fonctions de base créées sont env_new() qui crée un environnement vide et env_bind() qui prend un environnement, la chaîne et la valeur et lie la chaîne à la valeur en revenant un nouvel environnement.

test montrant la fonctionnalité ML sont les suivantes:

- 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 

Ma déclaration actuelle de ce type dans Haskell et les fonctions connexes est:

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 

J'ai beaucoup de mal à déterminer la syntaxe correcte pour ces définitions. S'il vous plaît répondez avec des conseils qui pourraient m'aider à faire des progrès à ce sujet. Gardant à l'esprit que c'est pour le crédit d'honneur - je ne m'attends pas à des solutions complètes, mais simplement de l'aide (pas que je rejette les solutions).

+0

Ne confondez pas le type avec son constructeur de données. Par exemple, 'Env" Foo "" Bar "' crée une valeur de type 'Env String', tandis que (en supposant que 9 est un' Int' pour but de cet exemple) 'Env" Bar "9' crée une valeur de type' Env Int'. Considérez comment cela affecte votre tentative de définition de 'envNew'. – chepner

+0

'type Env a = String -> a' était un peu trop évident, je suppose. (Votre type Haskell correspondrait à 'datatype 'a Env = Env de la chaîne *' a' dans SML.) – molbdnilo

Répondre

3
data Env a = Env String a 

Ce n'est pas le même type que dans ML: il n'y a pas de flèche ci-dessus. Vous voulez

data Env a = Env (String -> a) 

Ensuite,

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

cela n'a pas le même type que ML! Répare ça.

En outre,

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

peu de sens: il ne même pas utiliser l'environnement. Commencez par la définition de ML que vous avez, et essayez de l'imiter.