【问题标题】:Haskell group predefined length no explicit recursionHaskell 组预定义长度没有显式递归
【发布时间】:2016-04-21 08:32:03
【问题描述】:

如何在不使用显式递归的情况下创建一个将列表元素分组为预定义长度列表的函数。

例如,对于 2:

[1, 2, 3, 4, 5, 6, 7, 8]
[[1, 2], [3, 4], [5, 6], [7, 8]]

谢谢!

【问题讨论】:

  • 你可以使用折叠。在折叠的累加器(输出列表)中,您可以检查最后一个元素(子列表)的长度,如果它小于预定义长度,则将当前元素附加到它,如果长度等于预定义长度,然后开始一个新列表。
  • 我不明白“不使用显式递归”的说法。如果你使用助手,它肯定是递归的;那有什么意义呢?
  • 在没有显式递归的情况下编写这个函数的动机是什么?

标签: haskell


【解决方案1】:

以下方法可行(尽管您可能认为使用 Data.List 中的groupBy 是作弊)

import Data.Function (on)
import Data.List     (groupBy)

group :: Int -> [a] -> [[a]]
group n = map (map snd)
        . groupBy ((==) `on` fst)
        . zip (enumFrom 1 >>= replicate n)

【讨论】:

    【解决方案2】:

    如果您将换行设置为 100 个字符,则这是一个单行:)。我猜你正在寻找使用折叠的东西。

    group :: Int -> [a] -> [[a]]
    group n = uncurry (:) . foldr (\x (l,r) -> if length l == n then ([x],l:r) 
                                                                else (x:l,r))
                                  ([],[])
    

    【讨论】:

      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 2018-12-28
      • 2017-06-06
      • 2012-09-13
      • 1970-01-01
      相关资源
      最近更新 更多