在Haskell中创建环境数据类型

时间:2016-03-31 08:54:48

标签: haskell types smlnj ml environments

为了获得课程的荣誉学分,我的任务是重新创建我们在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

我很难确定这些定义的正确语法。请回复任何有助于我在此方面取得进展的提示。请记住,这是为了荣誉 - 我不期望任何完整的解决方案,只需要一些帮助(不是我会拒绝解决方案)。

1 个答案:

答案 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中的定义开始,尝试模仿那个。