为了获得课程的荣誉学分,我的任务是重新创建我们在ML中完成的任务(使用SMLNJ实现),但是使用haskell。这里的目标是创建一个数据类型 environment ,它将值绑定到字符串。
ML中的类型声明是:
type 'a Env = string -> 'a;
创建的基本函数是env_new()
,它创建一个空的环境,env_bind()
获取环境,字符串和值,并在返回新环境时将字符串绑定到值。
显示ML功能的测试如下:
- 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和相关函数中的此类声明是:
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
我很难确定这些定义的正确语法。请回复任何有助于我在此方面取得进展的提示。请记住,这是为了荣誉 - 我不期望任何完整的解决方案,只需要一些帮助(不是我会拒绝解决方案)。
答案 0 :(得分:3)
data Env a = Env String a
这与ML中的类型不同:上面没有箭头。你想要
data Env a = Env (String -> a)
然后,
envNew :: a -> Env a
envNew a = Env a
这与ML中的类型不同!解决了这个问题。
此外,
envBind :: Env a -> String -> a -> Env a
envBind environment name value = Env name value
毫无意义:它甚至不使用环境。从ML中的定义开始,尝试模仿那个。