2017-06-27 98 views
2

我编写了这个函数来确定给定元素是否存储在元组列表的列表中,但是此刻它只搜索第一个列表。我将如何去搜索其他列表?标准ML:通过列表搜索

fun findItem (name : command, ((x,y)::firstlist)::tail : (command*command) list list) = 
    if x = name then true else findItem(name, firstlist::tail) 
    | findItem(name, [[]]) = false 

回答

4

你会递归在列表的其余部分(你需要3起):

fun findItem (name, ((x,_)::firstlist)::tail) = x = name orelse findItem(name, firstlist::tail) 
    | findItem (name, []::tail) = findItem (name, tail) 
    | findItem(name, []) = false 

但它更容易对眼睛,如果你先写,搜索通过列表,然后函数使用,在其他功能:

fun findItemHelper (_, []) = false 
    | findItemHelper (name, (n', _)::ns) = name = n' orelse findItemHelper (name, ns) 

fun findItem (_, []) = false 
    | findItem (name, n::ns) = findItemHelper (name, n) orelse findItem (name, ns) 

这些是除了orelse之前的部分完全一样的,所以我们可以抽象说出来与谓词函数:

fun find (_, []) = false 
    | find (found, x::xs) = (found x) orelse find (found, xs) 

,并使用它:

fun findItemHelper (name, ns) = find (fn (n, _) => name = n, ns) 

fun findItem (name, nss) = find (fn ns => findItemHelper (name, ns), nss) 
3

为了补充molbdnilo的答案,这里是我将如何实现它。使用标准List.exists库函数它将成为一个单行:

fun findItem (x, ll) = List.exists (List.exists (fn (y,_) => x = y)) ll