2017-06-27 10 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 

しかし、あなたが最初にそのリストを検索関数を記述している場合、それは目にはるかに簡単ですこれらはorelseの前の部分を除いてまったく同じです

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) 

ので、私たちすることができます述語関数を持つ抽象そのアウト:別の関数にそれを使用

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ライブラリー機能を使用すると、1ライナーになります。

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