SML:我想查看一个列表并返回输入到给定函数

时间:2018-03-03 03:27:49

标签: list sml ml

问题可能听起来令人困惑,但基本上 我想创建一个包含列表和另一个函数的函数。现在浏览该列表我想得到输入到此参数函数时返回true的元素数。我是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);

1 个答案:

答案 0 :(得分:1)

该函数不应返回布尔值,因此你的助手也不应该 "递增"也是一种在没有变异的语言中没有多大意义的概念 (counter = counter + 1是一种永远不会成真的比较。)

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

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

在ML:

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