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).
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
'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