我正在从事大学任务,该任务涉及以嵌套对的形式构建列表。对于对,存在如下数据结构:
data Data = Pair { first :: Data, second :: Data } | ...
我尝试编写一个append函数,它接受一对和附加到给定对的新值:
append :: Pair -> Data -> Pair
append p new = append' p p new
where
append' :: Pair -> Pair -> Data -> Pair
append' p cur@(Pair Nil _) new = p where { cur = cur { first=new } }
append' p cur@(Pair _ Nil) new = p where { cur = cur { second=(Pair new Nil) } }
append' p cur@(Pair _ (Pair _ _)) new = append' p (second cur) new
我们的想法是始终保持对结尾(p)返回的给定对的引用,同时通过嵌套的Pair结构递归移动(cur)直到遇到结束(第二个是Nil)at然后新元素以另一对的形式添加。
我认为这不起作用,因为它需要通过引用传递,而在副作用较少的Haskell中则不是这种情况。
如果有人能指出我如何解决这个问题的正确方向,我将非常感激。
答案 0 :(得分:4)
Haskell在概念上并没有真正的参考。当然Haskell使用了很多引用(例如减少了内存负载),还有像Data.IORef
之类的模块,我们可以使用IO
来使用引用。但是这些函数实际上没有概念引用。
此外,您使用类似p where {cur = cur {first = new } }
的内容,您似乎在寻找作业。 Haskell没有赋值,它只有声明。
如果你想追加,你需要构建一个 new Pair
。我们可以使用:
append :: Pair -> Data -> Pair
append (Pair Nil r) dat = Pair dat r
append (Pair l Nil) dat = Pair l dat
append (Pair l r) dat = Pair l (append r dat)
因此,对于前两行,我们构建了一个新对,我们将Nil
替换为data
。在后一种情况下(两者都是非Nil
),我们构造一个新对,我们在其中进行递归append
调用以计算新的右边部分。