【问题标题】:Reverse a custom nested list in Haskell在 Haskell 中反转自定义嵌套列表
【发布时间】:2016-04-08 21:03:04
【问题描述】:

我正在尝试在 Haskell 中反转嵌套列表。我知道嵌套列表在 Haskell 中不是一个东西,所以我定义了一个:

data NestedList a = Elem a | SubList [NestedList a]

我还有一个扁平化功能:

flatten :: NestedList a -> [a]
flatten (Elem x) = [x]
flatten (SubList x) = concatMap flatten x

现在我想编写我的反向函数。函数定义为:

myreverse :: NestedList a -> NestedList a

我认为这是有道理的,因为我只是重新排列列表中的元素。

我了解如何编写基本的反向函数,并且我也知道对于 Haskell 的标准列表,反向已经定义。

我的问题是:如何处理列表头也是列表的情况?我知道需要发生的是我反转列表的头部并将其放回尾部的反面。但是如何实现呢?

【问题讨论】:

    标签: list haskell nested reverse


    【解决方案1】:

    为什么不这样

    rev :: NestedList a -> NestedList a
    rev (Elem a) = Elem a
    rev (SubList xs) = SubList $ map rev $ reverse xs
    

    如果您在数据定义中添加派生(显示),

    Prelude> rev $ SubList [Elem 1, SubList [Elem 2, Elem 3]]
    SubList [SubList [Elem 3,Elem 2],Elem 1]
    
    Prelude> rev $ SubList [Elem 1, SubList []]
    SubList [SubList [],Elem 1]
    

    【讨论】:

      【解决方案2】:

      您的嵌套列表实际上是一棵树,其元素位于叶子:

                       SubList
                     /         \
              SubList           Elem 4
          /      |      \
      Elem 1   Elem 2   Elem 3
      

      所以你的myreverse 将是一个水平翻转,即reverse 中每个列表的递归SubList,正如其他答案指出的那样。

      这里的教训:可视化数据结构有助于理解和实施对它们的操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 2020-02-28
        • 2022-01-20
        • 2015-01-06
        • 2012-02-25
        相关资源
        最近更新 更多