2011-04-01 39 views
0

目的:尋找名單的排列,如[「ABC」,「BC」,「ACC」]哈斯克爾:如何在列表中擺脫兩倍或三倍的元素

問題:我的置換含有一倍和三倍的元素,我想擺脫這些元素。

,我從列表中獲得的上述結果如下:

[[ 「ABC」, 「BC」, 「ACC」],[ 「ABC」, 「BC」],[ 「ABC」,」 ACC 「 」BC「],[ 」ABC「, 」ACC「],[ 」ABC「, 」ACC「],[ 」ABC「],[ 」BC「, 」ABC「, 」ACC「],[」 BC 「 」ABC「],[ 」BC「, 」ACC「, 」ABC「],[ 」BC「, 」ACC「],[ 」BC「, 」ACC「],[ 」BC「],[」 acc「,」abc「,」bc「],[」acc「,」abc「],[」acc「,」bc「,」abc「],[」acc「,」bc「],[」acc 「」acc「,」bc「],[」acc「],[」bc「],[」acc「],[」bc「,」acc「],[」bc「],[」acc「 acc「],[]]

我爲了擺脫這些加倍的元素而編寫的代碼如下所述:

fct [] = [] 
fct (xs) 
    | (head xs) `elem` xs = fct (delete (head xs) xs) 
    | otherwise = fct xs 

這裏我想把列表的第一個元素與列表的其餘部分進行比較。 你能幫我找到解決我的問題的方法嗎?

+0

代碼是否工作? – 2011-04-01 16:10:38

+2

查看Prelude中的'nub'功能。如果它太慢,那麼找到巴特的'nubOrd',並且可能會完成他開始將其投入基地的事情。 – 2011-04-01 16:12:59

+1

而不是生成額外的條目,然後刪除它們,爲什麼不只是生成你想要的? – drysdam 2011-04-01 16:16:19

回答

2

這些不是排列組合,因爲其中有些不包含所有原始元素。它似乎是排列和選擇的組合。

在ghci的:

Prelude Data.List Control.Monad> concatMap permutations $ filterM (const [False, True])["abc", "bc", "acc"] 
[[],["acc"],["bc"],["bc","acc"],["acc","bc"],["abc"],["abc","acc"],["acc","abc"], ["abc","bc"],["bc","abc"],["abc","bc","acc"],["bc","abc","acc"],["acc","bc","abc"],["bc","acc","abc"],["acc","abc","bc"],["abc","acc","bc"]] 
0

您可以使用函數nub從列表中刪除重複。