【发布时间】:2014-01-28 18:55:45
【问题描述】:
这是一个函数的伪代码,它将在给定路径和新值的情况下修改树上的特定节点:
path_set val path tree =
| empty? path -> val
| otherwise -> set (path_set val (tail path) (get tree (head path))) tree
例如,
path_set 50 [1 1] [[1 1] [1 1]] = [[1 1] [1 50]]
这个算法如何使用 fold 来实现?
【问题讨论】:
-
折叠可能不是最好的方法。折叠通常用于迭代应用,而不是递归。您还没有定义什么样的树,所有的路径代表什么等等。您也可能希望将树实现为自己的数据类型,因为列表不能任意嵌套在 Haskell 中,分支必须可以这么说,具有相同的深度。
-
如果你想用折叠做到这一点,你需要一个拉链。实际上,LYAH 教程有一个关于拉链的页面,几乎解决了这个确切的问题:根据方向列表在树中移动。 learnyouahaskell.com/zippers 所以,你可以用 fold 来做,但它可能不会更干净或更快,因为你提供的代码已经很简单了。
标签: algorithm haskell functional-programming scheme