【问题标题】:How to implement a deep-tree-set algorithm using fold?如何使用折叠实现深度树集算法?
【发布时间】: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


【解决方案1】:

好吧,没有人回答,这是我的解决方案:

(λ (λ (λ (foldr (λ (λ (set B (get 0 A) (get 1 A)))) C ((λ (λ (foldl (λ (λ (conc B (list ((list (A (if (eq (len B) 0) C (get (get 0 (last B)) (get 1 (last B))))))))))) (list) B))) B A)))))

在 lambda 演算中,bruijn 索引由按字母顺序升序的字母和 conc 列表编码。

这确实不是最理想的,但对于我的用例来说效果很好,因为它几乎总是减少编译时间(当你想调用 set 时,你几乎总是定义了路径)。

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多