【发布时间】:2022-01-06 07:21:36
【问题描述】:
考虑下面的 Python 函数,给定节点的后继节点,访问它们并收集结果。 (实际上,此逻辑将构成递归 visit 函数的一部分。)
from typing import Any, Callable, Tuple, List, Set
Node_key = Any
Discovered = Set[Node_key]
Result = Any
def get_successor_results(visit: Callable[[Discovered, Node_key],
Tuple[Discovered, Result]],
successors: List[Node_key],
disc: Discovered) -> List[Result]:
results = []
for succ in successors:
if succ not in disc:
disc, result = visit(disc, succ)
results.append(result)
return results
(对于上下文,这将是 df-traverse 函数的一部分,给定图形和函数 combiner :: Node_key -> [Result] -> Result 将等效于构建深度优先森林并在每棵树上调用 fold-tree combiner。)
我的问题:你会如何在 Haskell 中写
get_successor_results?一些想法:
get-successor-results visit successors disc = reverse . first . conditional-fold (\\(d, _) node -> not (elem node d)) (cons-next-result visit) (empty-set, []) successors where cons-next-result visit _@(disc, results) node = let (disc-new, result) = visit disc node in (disc-new, result:results) conditional-fold p folder e xs = case xs of {[] -> e; x:xs\' -> if p e x then conditional-fold p folder (folder e x) xs\' else conditional-fold p folder e xs\'}
标签: haskell depth-first-search fold