如何处理函数式编程中的“丢失对象”?

时间:2015-08-17 20:03:02

标签: haskell functional-programming

我正在使用Haskell,编写程序时遇到的一个重大问题是,当我想对某个对象执行某些操作时,我的程序会忘记之前使用它做的所有事情。例如,当您使用拉链实现树时,为了能够分辨出您在树上的位置,每次移动时都必须将所有节点存储在路径中的左右两侧。类似地,如果我想编写一个简单的深度优先搜索,我觉得我必须保留另一个单独的记录,我已经访问过哪些顶点,以及我想要进入下一个顶点,以免我返回旧顶点并忘记我去过的地方。

我的问题是:这种情况一直在发生吗?为正确的数据编写功能程序的“正确”方法是否会拖累您过去所做的所有事情?

1 个答案:

答案 0 :(得分:1)

data SimpleTree a = Leaf a | Branch a (SimpleTree a) (SimpleTree a)

dfs :: Eq a => a -> SimpleTree a -> Bool
dfs val (Leaf v2) = v2 == val
dfs val (Branch v2 t2 t3) = v2 == val
                            || dfs val t2
                            || dfs val t3

然后:

*Main> let sampleTree = Branch 5 (Branch 4 (Leaf 3) (Leaf 2)) (Leaf 6)
*Main> map (\n -> dfs n sampleTree) [1..7]
[False,True,True,True,True,True,False]

我的DFS算法没有显式携带访问树节点列表。

为结构编写算法的正确方式取决于您的结构,但没有普遍要求您拖动已访问节点列表。 (拉链确实有这个要求 - 它对它们的工作方式至关重要。)