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

时间:2015-11-06 09:48:28

标签: algorithm list ocaml sml

我要调整标准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的初学者,因此理解如何操作列表列表非常复杂。 :/

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

嗯,这看起来像家庭作业,尽管评论,因为这是一个典型的练习,和FP成语。

ML(sic)中的标准解决方案是一种递归函数,其中参数充当存储器以对某些内容进行求和或收集某些列表。其他参数(输入数据)在每一步都会减少,当为空时会导致递归终止。

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

希望这有帮助。