2012-03-22 63 views
3

我是新來的haskell,並試圖編寫一個函數來生成一個只包含連續子集的powerset 例如:[1,2,3] - > [[],[1], [2],[3],[1,2],[2,3],[1,2,3]]生成列表的子列表

我發現這個在博客http://davidtran.doublegifts.com/blog/?p=7

powerset :: [a] -> [[a]] 
powerset []  = [[]] 
powerset (x:xs) = powerset xs ++ map (x:) (powerset xs) 
-- powerset (x:xs) = powerset xs ++ [x:xs' | xs' <- powerset xs] 

但這生成所有子集即[1,3]包括我不想要的? 有無論如何修復此代碼的工作或我必須重新考慮我的方法。 另外我不想使用內置的庫函數,想讓我的基礎知識正確。

+0

東西你說的 '連續的子集' 是什麼意思? – yatima2975 2012-03-22 23:21:06

+0

我的意思是[1,2] [2,3]但不是[1,3] – NyaniOS 2012-03-22 23:46:29

+2

作爲術語的問題:我通常看到人們使用術語*子串*來指代「連續子集」和術語*子序列*不一定是連續的子集。 – hugomg 2012-03-23 14:31:03

回答

12

conseqPower = ([] :) . concatMap (tail . inits) . tails 
+0

我會試試這個,但我寧願不要使用2個功能 – NyaniOS 2012-03-22 23:48:07

+2

那麼,你可以自己寫。但是重用現有功能會更方便。 – augustss 2012-03-22 23:50:20

+0

好的,非常感謝。 – NyaniOS 2012-03-22 23:58:40

0

過濾出非「連續」列表。

+0

我可以得到一些代碼不知道如何過濾,或者一些鏈接過濾功能? – NyaniOS 2012-03-22 23:47:35

+0

@NyaniOS Hoogle it。 – Marcin 2012-03-22 23:51:55

+1

這種方法似乎需要'Eq a',並且在列表中出現重複項目時似乎仍然很難(例如考慮'powerset「hello」')。 – dave4420 2012-03-23 08:34:16