【问题标题】:Standard ML: Searching through a list of lists标准 ML:搜索列表列表
【发布时间】:2017-11-30 00:48:54
【问题描述】:

我编写了这个函数来确定给定元素是否存储在元组列表中,但是目前它只搜索第一个列表。我将如何搜索其余的列表?

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 

【问题讨论】:

    标签: list functional-programming sml ml


    【解决方案1】:

    您将递归其余列表(您需要三个案例):

    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)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-11-23
        • 1970-01-01
        • 2015-04-05
        • 2014-04-02
        • 2012-04-14
        • 2011-05-05
        • 2020-07-07
        • 1970-01-01
        • 2019-08-02
        相关资源
        最近更新 更多