1

为了获得一门课程的荣誉学分,我的任务是重新创建我们在 ML 中完成的作业(使用 SMLNJ 实现),但改用 haskell。这里的目标是创建一个将值绑定到字符串的数据类型环境。

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

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

4

1 回答 1

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

于 2016-03-31T09:03:39.210 回答