Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sml 在函数表示的环境中查找值_Sml_Ml_Mosml - Fatal编程技术网

Sml 在函数表示的环境中查找值

Sml 在函数表示的环境中查找值,sml,ml,mosml,Sml,Ml,Mosml,在bst环境中查找值时,我所要做的就是将要查找的值与节点上的根值进行比较 type 'a tenv = (name * 'a) btree exception NotFound of name fun find compare name Leaf = raise NotFound name | find compare name (Node (lt, (key, value), rt)) = case compare(name, key) of LESS => find

在bst环境中查找值时,我所要做的就是将要查找的值与节点上的根值进行比较

type 'a tenv = (name * 'a) btree

exception NotFound of name
fun find compare name Leaf = raise NotFound name 
| find compare name (Node (lt, (key, value), rt)) = 
  case compare(name, key) of
    LESS => find compare name lt
  | GREATER => find compare name rt
  | EQUAL => value
但是,在一个用env表示的函数中,而不是用节点和叶表示的bst,find函数的类型是

name * 'a fenv -> 'a

我对函数有了大致的了解,但对于如何遍历环境以查找名称,我感到困惑。Bst有一个节点和一个树状结构。如果可能的话,有人能解释一下吗

编入

我的工作实现是这样的

exception NotFound of name
val Empty = fn name => raise NotFound name

fun Find(name, env) = env name

fun Bind(name, data, rho) = fn key => if key = name then data else rho 
key 

因此,一个环境现在被表示为一个函数,该函数接受一个名称,并在环境中返回其值或引发异常。
此函数将由函数组成,您可以通过应用表示旧环境的函数来“遍历”它。
(这听起来比实际情况更复杂,但你可能需要一段时间才能理解。)

您可以通过编写一个函数来创建空环境,该函数采用名称并引发异常:

val empty = fn n => raise NotFound n
查找内容比树查找要短得多,因为环境已经具备了该功能:

fun find n env = env n
剩下的是插入:

fun insert (key, value) env = ... what?
它必须是一个具有名称的函数,因为这就是环境

fun insert (key, value) env = fn n => ... what?
如果
n
相同,则该函数应返回

fun insert (key, value) env = fn n => if n = key then value else ... what?
n
可能在环境的其余部分中找到,因此我们应用该函数以便在那里查找它:

fun insert (key, value) env = fn n => if n = key then value else env n
正如他们所说,这是事实

从某种意义上说,“遍历”代码已经从查找函数转移到插入函数

测试:

如您所见,将事物表示为函数可以非常紧凑


为了了解发生了什么,让我们展开第一个示例:

val env = insert ("hi", 23) empty
这与(扩展
insert
的定义)相同:

成功查找:

find "hi" env

那是

(fn n => if n = "hi" then 23 else empty n) "hi"
->
if "hi" = "hi" then 23 else empty n
-> 
23
失败:

find "hello" env
->
(fn n => if n = "hi" then 23 else empty n) "hello"
->
if "hello" = "hi" then 23 else empty "hello"
->
empty "hello"
->
raise NotFound "hello"

异常处理示例:

如果不处理异常,将出现“未捕获异常”错误,如上面的示例所示

您需要在使用
find
的代码中处理异常
一个简单的例子:

fun contains n env = let val _ = find n env
                     in true
                     end
                     handle NotFound nm => false


- contains "hello" env;
val it = false : bool
- contains "hi" env;
val it = true : bool

molbdnilo非常感谢您在4个小时尝试了不同的方法并阅读了不同的解释之后,您的解释变得更有意义。抱歉,当find在给定的环境中找不到名称时,我会出错,因此我将我的改为如下(在我的原始帖子中编辑)但是我仍然犯错误,你能告诉我我是否在检查错误案例吗wrong@laughingllama42您不应该对任何内容进行任何模式匹配。但是,如果在find函数的env中找不到name,我该如何检查?您不需要检查–当函数调用链到达
empty
函数。这个答案中的三行代码是一个完整的实现。
env "hi"
(fn n => if n = "hi" then 23 else empty n) "hi"
->
if "hi" = "hi" then 23 else empty n
-> 
23
find "hello" env
->
(fn n => if n = "hi" then 23 else empty n) "hello"
->
if "hello" = "hi" then 23 else empty "hello"
->
empty "hello"
->
raise NotFound "hello"
fun contains n env = let val _ = find n env
                     in true
                     end
                     handle NotFound nm => false


- contains "hello" env;
val it = false : bool
- contains "hi" env;
val it = true : bool