SML:我想遍历一个列表和 return 输入给定函数时 return 为真的元素数量

SML: I want to go through a list and return the number of elements that return true when inputted into a given function

这个问题可能听起来很混乱,但基本上 我想制作一个接受列表和另一个函数的函数。现在浏览该列表,我想获得输入到此参数函数时 return 为真的元素的数量。我是 sml 的新手,所以我的错误是我打算向辅助函数添加一个计数并将其与 If 语句一起递增,但我很快了解到您不能真正递增 ml 中的值。有人可以解释一下这样做的更多 sml 方式吗?我只是想了解我所缺少的。

fun helper f nil counter = false
  | helper f xs 1 = true
  | helper f (x::xs) counter = 
    if (f x) = true then
      counter = counter + 1
    else
      counter = counter + 0


fun numberExisting f alist = (helper f alist 0);

函数不应该 return 布尔值,所以你的助手也不应该。
"Incrementing"也是一个概念,在没有突变的语言中没有多大意义。
counter = counter + 1是一个永远不会正确的比较。)

你不需要助手,但你需要递归思考:

  • 如果列表为空,则结果为零。
  • 如果列表不为空:
    • 如果给定的谓词对于列表的头部为真,则结果比在列表的尾部递归的结果多一。
    • 如果列表头部的给定谓词为假,则结果与在列表尾部递归的结果相同。

在 ML 中:

fun numberExisting _ [] = 0
  | numberExisting f (x::xs) = if f x 
                               then 1 + numberExisting f xs
                               else numberExisting f xs