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
的所有元素。
我正在尝试在 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
的所有元素。