1

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

我需要在标准 ML 中创建一个名为 lookup(k, table) 的函数,如果 k 不是查找表中的键,则返回 NONE,如果 (k,v) 在表中则返回 (SOME (k,v))。例如lookup(3, [(1,4),(14,5),(7,3),(22,6]) 是NONE,而lookup (1,[(1,4),(14,5) ,(7,3,(22,6)]) 是 (一些 (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 问题,我一直在拔头发。

4

1 回答 1

1

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

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

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

它使用函数find来遍历表;find将使用抽象分解fn (key, value) => key = k中的每个键值对并检查键是否匹配klookup将返回find的结果,如果(k, x)table中,则为 ,否则为 。SOME xNONE

于 2012-11-14T08:56:35.737 回答