标准ML:搜索列表列表

时间:2017-06-27 04:26:14

标签: list functional-programming sml 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 

2 个答案:

答案 0 :(得分:4)

你会对其余的名单进行递归(你需要三个案例):

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)

答案 1 :(得分:3)

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

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