我要调整标准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的初学者,因此理解如何操作列表列表非常复杂。 :/
答案 0 :(得分:2)
一些提示:使用List.fold和List.length对列表的大小求和。 在单行中,您应该能够实现您的伪代码。 应该是这样的事情:
List.fold (fun acc x -> acc+List.length x) 0 your_list_of_list.
答案 1 :(得分:1)
ML(sic)中的标准解决方案是一种递归函数,其中参数充当存储器以对某些内容进行求和或收集某些列表。其他参数(输入数据)在每一步都会减少,当为空时会导致递归终止。
这个习惯用法的目的是尽量减少程序中可变状态的使用。
希望这有帮助。