计算列表列表中元素的数量

Count number of elements in a list of lists

我必须在标准 ML 中调整现有代码,但我现在遇到了一个问题。

我有一个函数返回我的元素列表(我们称它们为节点(或世界))

val worlds = listNodes()

并且对于每个 world 我有一个函数 fun listSuccessors w r 返回每个世界的后继者数量。

我的问题是:如何获取全局的继承人数量?

在伪代码中,我想要这样的东西:

worlds <--  listNodes ()
solution  <-- 0

foreach w in worlds do 
     solution <-- solution + (length (listSuccessors w))
end foreach

return solution

但不幸的是,我不知道该怎么做:/

以下是现有功能:

fun listSuccessors w r =
        let
            val succs =
                case Dynarraydict.get (nodes, Node.getId w)
                    of ROOT (_, _, succs) => succs
                     | _ => Exn.unexpArg "Nodestore.listSuccessors.succs"
        in
            List.mapPartial (fn (n, r', _) => if r = r' then SOME (getNode n) else NONE) succs
        end

fun listNodes () = Dynarraydict.foldr (fn (_, ROOT item, ys) => (#1 item)::ys | (_, _, ys) => ys) nil nodes  

预先感谢您的帮助:/不幸的是,我是标准 ML 的初学者,因此理解如何操作列表列表非常复杂。 :/

嗯,尽管有评论,这看起来像是作业,因为它是一个典型的练习,也是一个 FP 习语。

ML(原文如此)中的一个标准解决方案是一个递归函数,其中参数充当存储来总结某些东西或收集一些列表。其他参数(输入数据)在每一步都减少,当为空时导致递归终止。

这个习惯用法的目的是尽量减少程序中可变状态的使用。

希望对您有所帮助。

一些提示:使用 List.fold 和 List.length 对列表的大小求和。 在 1 行中你应该能够实现你的伪代码。 它应该是这样的:

List.fold (fun acc x -> acc+List.length x) 0 your_list_of_list.