众所周知,列表的powerset:
{1,2,3,4} is {{},{1},{2},{1,2},{3},{1,3},{2,3},{1,2,3},{4},{1,4},{2,4},{1,2,4},{3,4},{1,3,4},{2,3,4},{1,2,3,4}}
我遇到的问题的haskell代码是:
potencia [] = [[]]
potencia (a:bs) = potencia bs ++ map (a:) (potencia bs)
现在,我如何获得相同长度的子列表列表?例如,上面的列表将生成下一个长度为3的子列表列表3 = {{1,2,3},{1,2,4},{1,3,4}}
我是学生,对不起我的英语,提前谢谢... XD
答案 0 :(得分:5)
怎么样
sublists _ 0 = [[]]
sublists [] _ = []
sublists (x:xs) n = sublists xs n ++ map (x:) (sublists xs $ n - 1)
这与您拥有的代码非常相似,但只有两个递减参数,即长度和列表。
另外,对于更高级的Haskellers
powerset = flip runCont id . foldM step [[]]
where step xs x = cont $ \c -> c xs ++ c (map (x:) xs)
是一个不使用continuation进行递归的powerset实现。对sublists
函数执行相同操作是一项有趣的挑战。
答案 1 :(得分:4)
我在想
subsequencesOf :: Int -> [a] -> [[a]]
subsequencesOf n = filter ((== n) . length) . subsequences
哪个会给你
> subsequencesOf 3 [1, 2, 3, 4]
[[1,2,3],[1,2,4],[1,3,4],[2,3,4]]
虽然我觉得奇怪的是,这不是Data.Set
中的操作,Set
不是monad(因此有replicateM
的版本。)I猜测那里可能存在障碍。