在 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
现在,对于问题的后半部分,您必须定义一个函数,用于将 name
与 value
关联到现有环境。这将是该函数的类型:
val fenvAssoc : 'a fenv -> name -> 'a -> 'a fenv
请注意上面的 returns 类型为 'a fenv
的结果。但请记住 fenv
实际上是什么。这是"just"一个函数:
type 'a fenv = name -> 'a
因此,这个返回值,一个函数,需要以某种方式 "remember" 与它关联的 name
和 value
。 "remember" 它们在定义它们的上下文中 "seen" 通常如何运作?
要查找名称的值,您需要第三个函数,它采用现有环境和名称以及 returns 该名称的值(如果有):
val fenvLookup : 'a fenv -> name -> 'a
再次记住'a fenv
的类型是什么:
type 'a fenv = name -> 'a
我强调这一点是因为 'a fenv
的类型限制了您可以对其应用的操作。您基本上可以:a) 创建一个函数或 b) 应用一个函数。
好的,所以我正在为 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
现在,对于问题的后半部分,您必须定义一个函数,用于将 name
与 value
关联到现有环境。这将是该函数的类型:
val fenvAssoc : 'a fenv -> name -> 'a -> 'a fenv
请注意上面的 returns 类型为 'a fenv
的结果。但请记住 fenv
实际上是什么。这是"just"一个函数:
type 'a fenv = name -> 'a
因此,这个返回值,一个函数,需要以某种方式 "remember" 与它关联的 name
和 value
。 "remember" 它们在定义它们的上下文中 "seen" 通常如何运作?
要查找名称的值,您需要第三个函数,它采用现有环境和名称以及 returns 该名称的值(如果有):
val fenvLookup : 'a fenv -> name -> 'a
再次记住'a fenv
的类型是什么:
type 'a fenv = name -> 'a
我强调这一点是因为 'a fenv
的类型限制了您可以对其应用的操作。您基本上可以:a) 创建一个函数或 b) 应用一个函数。