Haskell 包含文件夹的子列表

Haskell sublist with foldr

我正在尝试在 haskell 中创建一个函数,但我的目标是通过使用 foldr over list 来实现,这是一个示例:

sublistas [5,1,2] 
 [[],[2],[1],[1,2],[5],[5,2],[5,1],[5,1,2]]

效率不是问题。到目前为止我的尝试给了我错误:

cannot construct the infinite type .....

sublistas = foldr (\x rs -> [x] ++ map (x:) rs) [[]]

我试了很久,有没有人可以给我点意见?

您可以使用:

foldr (\x rs -> <b>rs</b> ++ map (x:) rs) [[]]

例如:

Prelude> foldr (\x rs -> rs ++ map (x:) rs) [[]] [5,1,2]
[[],[2],[1],[1,2],[5],[5,2],[5,1],[5,1,2]]

提议的 foldr 因此工作如下:我们从 [[]] 开始。现在对于一个元素 x,我们生成所有已经生成的列表的串联(在第一步 [] 中,这些列表以元素为前缀,因此 [2])。

所以经过第一步,我们得到[[],[2]]。接下来我们再次折叠,现在我们生成 [[],[2],[1],[1,2]]。最后我们还使用 5,结果是 [[],[2],[1],[1,2],[5],[5,2],[5,1],[5,1,2]].

上面的解释还得偷懒看:rs没有必要计算(先),除非那是必须的。


您的 lambda 表达式 \x rs -> [x] ++ map (x:) rs 不正确有两个原因:

  • [x]是一个包含你提供的列表的item的列表,不是你提供的项目列表的列表,所以类型错误;和
  • 您无论如何都不应该在结果中添加 [x]:您传递了所有已经生成的元素,以及您在前面添加了 x 的所有元素。