2016-03-31 32 views
1

Bir kurs için onur kredisi elde etmek amacıyla, ML'de tamamladığımız (SMLNJ uygulamasını kullanarak) bir ödevi yeniden oluşturmakla görevlendirildim, ancak bunun yerine haskell'i kullanıyorum. Buradaki amaç, değerleri dizelere bağlayan bir ortam veri türü oluşturmaktır.Haskell'de ortam veri türü oluşturma

ML yazın beyanıdır: Oluşturulan

type 'a Env = string -> 'a; 

temel fonksiyonlar dönerken değere dize bir ortam, dize ve değerini alır ve bağlanan boş ortam yaratır env_new() ve env_bind() vardır yeni bir çevre. aşağıdaki gibi ML işlevselliğini gösteren

Testi şunlardır:

- 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 ve ilgili fonksiyonlarda bu tip Benim şu anki beyanıdır: Ben çok zorlanıyorum

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 

endam Bu tanımlar için uygun sözdizimi. Lütfen bu konuda ilerleme kaydetmeme yardımcı olacak ipuçlarıyla cevap verin. Bunun ödül kredisi için olduğunu aklımda tutuyorum - tam bir çözüm beklemiyorum ama sadece bazı yardımları (çözümleri reddedemeyeceğim) beklemiyorum.

+0

Türü, veri kurucusu ile karıştırmayın. Örneğin, "Env" Foo "" Bar "," Env String "türünde bir değer oluşturur; (9, bu örnekteki amacın" Int "olduğu varsayılarak)" Env "Bar" (9), "tür" değeri oluşturur. Env Int'. Bunun, 'envNew'yi tanımlama girişimlerinizi nasıl etkilediğini düşünün. – chepner

+0

'tür Env a = Dize -> a' biraz fazla açıktı sanırım. (Haskell tipiniz, 'datatype' a karşılık gelir. Env = Dize Env = SML'de 'a'. – molbdnilo

cevap

3
data Env a = Env String a 

Bu, ML'deki ile aynı türde değildir: yukarıdaki ok yoktur. Sen

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

, Sonra

data Env a = Env (String -> a) 

istiyorum bu vardır değil ML aynı tip! Bunu düzelt. Ayrıca

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

biraz mantıklı: hatta çevreyi kullanmaz. Sahip olduğunuz ML'deki tanımdan başlayın ve onu taklit etmeye çalışın.