【问题标题】:Sublists of a list using list comprehension使用列表推导的列表子列表
【发布时间】:2011-03-01 08:41:51
【问题描述】:

就这么简单。我想使用列表推导生成列表的所有子列表。

即:getSublist [1,2,3] 是 [[1], [2], [3], [1,2], [1,3], [2, 3], [1,2, 3]]

谢谢

【问题讨论】:

  • 确实要排除空列表吗?

标签: haskell functional-programming list-comprehension


【解决方案1】:

这已经实现为Data.List.subsequences,但是如果你想自己定义它(用于学习目的),你可以这样做:

你不能只用列表推导来做到这一点,但通过一些递归它看起来像这样:

sublists [] = [[]]
sublists (x:xs) = [x:sublist | sublist <- sublists xs] ++ sublists xs

读取:空列表的唯一子列表是空列表。 x:xs 的子列表(即头部x 和尾部xs 的列表)是xs 的所有子列表以及xs 的每个子列表,前面加上x .

【讨论】:

  • 谢谢,这与我的想法相同,但纯粹是递归的:subList (x:xs) = (subList xs) ++ (map (\xs -> x:xs) (subList xs))
  • atks:请注意,您确实需要递归的基本情况。这与是否递归无关,而是关于 subList 您在此处编写它的方式仅针对非空列表定义 - 仅针对两个构造函数之一。
  • 我喜欢sublists = filterM $ const [False, True]
  • Mikael,谢谢你的意见,但我知道这一点。我只是在帖子中省略了,因为在 cmets 中发帖很糟糕。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多