通过嵌套对创建列表

时间:2018-01-16 16:56:27

标签: haskell

我正在从事大学任务,该任务涉及以嵌套对的形式构建列表。对于对,存在如下数据结构:

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中则不是这种情况。
如果有人能指出我如何解决这个问题的正确方向,我将非常感激。

1 个答案:

答案 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调用以计算新的右边部分。