2016-03-31 12 views
1

Um einen Honours Credit für einen Kurs zu erhalten, wurde ich damit beauftragt, eine Aufgabe, die wir in ML abgeschlossen haben, neu zu erstellen (unter Verwendung der SMLNJ-Implementierung), aber stattdessen haskell zu verwenden. Das Ziel besteht darin, einen Datentyp Umgebung zu erstellen, der Werte an Zeichenfolgen bindet.Erstellen eines Umgebungsdatentyps in Haskell

Die Typendeklaration in ML ist:

type 'a Env = string -> 'a; 

Die Grund erstellt Funktionen env_new() sind, die eine leere Umgebung schafft, und env_bind(), die eine Umgebung stattfindet, Bindfaden, und den Wert und bindet die Zeichenkette auf den Wert während der Rückkehr eine neue Umgebung.

Test, um die ML-Funktionalität zeigen, sind wie folgt:

- 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 

Meine aktuelle Erklärung dieser Art in Haskell und verwandte Funktionen ist:

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 

ich eine sehr harte Zeit habe das herauszufinden, richtige Syntax für diese Definitionen. Bitte antworten Sie mit irgendwelchen Hinweisen, die mir dabei helfen könnten, Fortschritte zu erzielen. Wenn man bedenkt, dass dies zu Ehren des Kredits ist, erwarte ich keine vollständigen Lösungen, sondern nur eine gewisse Unterstützung (nicht, dass ich Lösungen ablehnen würde).

+0

Verwechseln Sie den Typ nicht mit seinem Datenkonstruktor. Zum Beispiel erzeugt 'Env "Foo" "Bar" 'einen Wert vom Typ' Env String ', während (Env" Bar "9' unter der Annahme, dass 9 für dieses Beispiel ein 'Int' ist), einen Wert vom Typ' erzeugt Env Int'. Bedenken Sie, wie sich dies auf Ihren Versuch auswirkt, "envNew" zu definieren. – chepner

+0

'Typ Env a = String -> a 'war ein bisschen zu offensichtlich, denke ich. (Ihr Haskell-Typ würde dem Datentyp 'a' entsprechen. Env = Env der Zeichenkette * 'a' in SML.) – molbdnilo

Antwort

3
data Env a = Env String a 

Dies ist nicht der gleiche Typ wie in ML: Es gibt keinen Pfeil oben. Sie wollen

data Env a = Env (String -> a) 

Dann

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

dies hat nicht die gleiche Art wie in ML! Repariere das. Auch

,

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

machen wenig Sinn: es nicht einmal die Umgebung. Beginnen Sie mit der Definition in ML, die Sie haben, und versuchen Sie, diese nachzuahmen.

Verwandte Themen