在 SML 中为环境创建函数表示

Creating a Function Representation for Environments in SML

好的,所以我正在为 SML 中的环境创建函数表示:

type name = string
type 'a fenv = name -> 'a

我对如何进行这件事有点困惑。我需要做的第一件事是定义一个类型为 'a fenv 的值 fenvEmpty,它代表空环境(不绑定任何名称的环境)。到目前为止,我有这个:

val fenvEmpty = 
    let
        fun empty (name) = ???
    in
        empty
    end

我不确定我是否在正确的轨道上或其他什么。我应该从空函数中 return 做什么?输入 0、null 或 NONE 将不起作用。

稍后,我还必须编写 returns 数据与环境中特定名称关联的函数(查找函数),以及将数据绑定到环境中特定名称的函数(a绑定函数),但我已经卡在 fenvEmpty 部分了。

我想老师希望你在尝试查找未绑定值时 raise 异常:

type name = string
type 'a fenv = name -> 'a

exception UnboundName of name

fun fenvEmpty name = raise UnboundName name

但我认为,如果您首先尝试使用 fenv 的版本,而不是 returns NONE 的未绑定变量,它会对您有更大帮助。我相信这是因为,与异常相反,程序有更多的类型结构可以指导您编写实现(另请参见下文)。因此,首先尝试编写此实现,其中 fenv 是:

type 'a fenv = name -> 'a option

现在,对于问题的后半部分,您必须定义一个函数,用于将 namevalue 关联到现有环境。这将是该函数的类型:

val fenvAssoc : 'a fenv -> name -> 'a -> 'a fenv

请注意上面的 returns 类型为 'a fenv 的结果。但请记住 fenv 实际上是什么。这是"just"一个函数:

type 'a fenv = name -> 'a

因此,这个返回值,一个函数,需要以某种方式 "remember" 与它关联的 namevalue。 "remember" 它们在定义它们的上下文中 "seen" 通常如何运作?

要查找名称的值,您需要第三个函数,它采用现有环境和名称以及 returns 该名称的值(如果有):

val fenvLookup : 'a fenv -> name -> 'a

再次记住'a fenv的类型是什么:

type 'a fenv = name -> 'a

我强调这一点是因为 'a fenv 的类型限制了您可以对其应用的操作。您基本上可以:a) 创建一个函数或 b) 应用一个函数。