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

时间:2015-03-17 05:34:57

标签: sml

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

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

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

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

我不确定我是在正确的轨道上还是其他任何东西。我应该从函数返回什么空?输入0,null或NONE将不起作用。

稍后,我还必须编写返回与环境中特定名称相关的数据的函数(查找函数),以及将数据绑定到环境中的特定名称的函数(绑定函数),但是我我已经停留在fenvEmpty部分。

1 个答案:

答案 0 :(得分:0)

我认为老师希望您在尝试查找未绑定的值时raise出现异常:

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

exception UnboundName of name

fun fenvEmpty name = raise UnboundName name

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

type 'a fenv = name -> 'a option

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

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

请注意,上面的内容会返回'a fenv类型的结果。但请记住fenv实际上是什么。它只是一个功能:

type 'a fenv = name -> 'a

因此,这个返回值,一个函数,需要以某种方式“记住”与之关联的namevalue。功能通常如何“记住”他们在定义的环境中“看到”的东西?

要查找名称的值,您需要第三个函数,它接受现有环境和名称并返回该名称的值(如果有):

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

再次,请记住'a fenv的类型:

type 'a fenv = name -> 'a

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