具有查找功能的标准ML和查找表

时间:2012-11-14 05:48:11

标签: lookup sml ml

使用折叠函数SML创建查找函数

我需要在Standard ML中创建一个名为lookup(k,table)的函数,如果k不是查找表中的键,则返回NONE,如果(k,v)是,则返回(SOME(k,v))桌子。例如查找(3,[(1,4),(14,5),(7,3),(22,6))是无和查找(1,[(1,4),(14,5) ,(7,3,(22,6)])是(SOME(1,4))。

我想使用这个查找功能:

fun find pred [] = NONE
  | find pred (x::rest) = if pred x then SOME x else find pred rest;

这是我到目前为止所做的:

fun lookup(k,table) = NONE
 | lookup(k, find(k,table)) =
    if k = SOME then SOME else NONE;

请帮助我,因为这个ML问题,我一直在拔头发。

1 个答案:

答案 0 :(得分:1)

我相信你在这里混淆了模式匹配与功能应用。在函数定义中,您可以进行模式匹配,即定义应用iff函数的实际调用的参数与为参数指定的模式(由构造函数和变量组成)匹配的情况。你不能做的是在函数定义的等号的左侧调用一个函数:在... | lookup(k, find(k, table))中使用 find 是无效的。

此代码将返回中的第一个键值对,其键与 k 匹配:

fun lookup(k,table) = 
  find (fn (key, value) => key = k) table

它使用函数 find 来查看表格; find 将使用抽象fn (key, value) => key = k来分解中的每个键值对,并检查该键是否与 k 匹配。 lookup 将返回 find 的结果,如果(k,x)位于中,则结果为SOME xNONE,如果没有。