【问题标题】:Creating environment datatype in Haskell在 Haskell 中创建环境数据类型
【发布时间】:2016-07-19 14:58:03
【问题描述】:

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

ML 中的类型声明为:

type 'a Env = string -> 'a;

创建的基本函数是env_new(),它创建一个空环境,env_bind(),它接受环境、字符串和值,并将字符串绑定到值,同时返回一个新环境。

显示机器学习功能的测试如下:

- 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

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

【问题讨论】:

  • 不要将类型与其数据构造函数混淆。例如,Env "Foo" "Bar" 创建一个 Env String 类型的值,而(在本示例中假设 9 是一个 IntEnv "Bar" 9 创建一个 Env Int 类型的值。考虑一下这对您定义envNew 的尝试有何影响。
  • type Env a = String -> a 有点太明显了,我猜。 (您的 Haskell 类型将对应于 SML 中的 datatype 'a Env = Env of string * 'a。)

标签: haskell types smlnj ml environments


【解决方案1】:
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 中的定义开始,并尝试模仿那个定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    相关资源
    最近更新 更多