计算列表列表中元素的数量
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.
我必须在标准 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.