【问题标题】:Count elements in list for which a function returns true计算列表中函数返回 true 的元素
【发布时间】:2024-01-17 19:32:01
【问题描述】:

所以我目前正在准备考试,我一直在尝试解决这个问题,但我真的不知道如何解决。

我需要实现一个函数,它接受一个 'a 列表和一个 'a -> bool 函数作为参数,并返回列表中的 'a 元素的数量,当给定 'a -> bool 函数时返回 true作为参数。

到目前为止,这是我尝试过的代码:

 test([],funct) = []
  |test(x::xs,funct) = if (funct(x) then 1 + test(xs,funct)
                       else 0 + (xs,funct); 

错误:子句类型与之前类的类型不匹配; 任何帮助将不胜感激。

【问题讨论】:

    标签: function sml


    【解决方案1】:

    如果你用折叠来解决这个问题,

    fun countp p xs = List.foldl (fn (x, c) => if p x then c+1 else c) 0 xs
    

    函数也是tail-recursive

    【讨论】:

      【解决方案2】:

      两个问题:

      • 如果是空列表,则返回一个列表,而不是数字。
      • 在另一种情况下,else 部分缺少对test 的递归调用。

      【讨论】:

      • 另外,我会在你的 else 语句中避免使用 0 +
      • @MarcoLuzzara,我个人会写(if ... then 1 else 0) + ... 并避免重复通话。