使用折叠函数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问题,我一直在拔头发。
答案 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 x
表或NONE
,如果没有。