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