2012-11-14 34 views
1

使用折叠功能SML标准ML和查找表用查找功能

创建查找功能我需要建立一个功能标准ML称为查找(K,表)返回NONE如果k不是关键在查找表中并返回(SOME(k,v))如果(k,v)在表中。例如lookup(3,[(1,4),(14,5),(7,3),(22,6])为NONE,查找(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

+0

那么什么不适合你?我会注意到,你的语法有点不合适。包括'find(k,table)'使得它看起来像是在尝试模式匹配。另外,find函数会被curry,并且你试图以tupled形式使用它。也许你可以提炼出一些具体的问题,并发布特定的错误消息,如果你得到它们。 – Gian

回答

1

我相信你已经混淆模式与此功能的应用程序匹配。一个函数定义,您可以进行模式匹配,即定义适用的情况,如果函数的实际调用的参数与为参数给出的模式(由构造函数和变量组成)匹配。你不能做的是在功能定义的等号左侧调用一个函数:使用找到... | lookup(k, find(k, table))是无效的。

此代码将返回第一个键值对在其关键比赛ķ

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

它采用了功能找到都要经过台; 找到将使用抽象fn (key, value) => key = k分解中的每个键值对,并检查密钥是否匹配k查找将返回找到的结果,这要么是SOME x,如果(K,X),或NONE,如果不是。