簡體   English   中英

Haskell:從x元素列表中創建唯一的n元組

[英]Haskell: Create unique n-tuples from a list of x elements

我有一個x元素列表,我希望從中獲得所有可能的唯一n元組。

所以我基本上是在尋找實現

nub . map (take n) . permutations

不必創建重復項。

對我來說,這看起來像一個很可能已經在某個地方定義的函數。

是這樣嗎

你的意思是這樣嗎?

import Data.List (permutations)

choose n list = concatMap permutations $ choose' list [] where
  choose' []     r = if length r == n then [r] else []
  choose' (x:xs) r | length r == n = [r]
                   | otherwise     = choose' xs (x:r) 
                                  ++ choose' xs r

輸出:

*Main> choose 2 [0..5]
[[1,0],[0,1],[2,0],[0,2],[3,0],[0,3],[4,0],[0,4],[5,0],[0,5],[2,1]
,[1,2],[3,1],[1,3],[4,1],[1,4],[5,1],[1,5],[3,2],[2,3],[4,2],[2,4]
,[5,2],[2,5],[4,3],[3,4],[5,3],[3,5],[5,4],[4,5]]

Hayoo對於查找功能非常有幫助。 通過這個查詢 ,我找到了置換包,盡管我沒有詳細研究實現,但它似乎可以滿足您的要求。

但是,使用此處在堆棧溢出中討論的解決方案之一可能會更簡單。 搜索后發現了一些相關的帖子。 您可能會看一下有關 Data.List中permutations功能實現的討論 ,並對其進行修改以滿足您的需求。

既然您已請求元組,那么以下是利用列表是應用函子的事實的解決方案:

Prelude> let list = [0..4]
Prelude> import Control.Applicative
Prelude Control.Applicative> (,) <$> list <*> list
[(0,0),(0,1),(0,2),(0,3),(0,4),(1,0),(1,1),(1,2),...
Prelude Control.Applicative> (,,) <$> list <*> list <*> list
[(0,0,0),(0,0,1),(0,0,2),(0,0,3),(0,0,4),(0,1,0),(0,1,1),...

但是,由於定義不同類型的元組的類型不同,因此不可能編寫一個通用函數,該函數將基於某個n參數產生不同類型的結果。

雖然我必須指出,可以通過使用一些高級類型級編程技術來解決此問題,方法是為代表您要支持的元組的元組引入類型級自然類型的類型類和實例,但是我敢肯定這會過分。 此外,利用自然類型也將是多余的,因為所有必需的信息都可以從結果類型中確定,因此,一個簡單的類型類和您要支持的所有元組的實例就足夠了。

您可以使用Math.Combinatorics.Multisetcabal install multiset-comb ),即使輸入列表中存在重復項,也可以避免輸出列表中存在重復項:

import Math.Combinatorics.Multiset  (fromList, kSubsets, permutations)

permute :: Ord a => Int -> [a] -> [[a]]
permute n = concatMap permutations . kSubsets n . fromList

main = print $ permute 2 [1, 1, 2, 3]

生產:

[[2,3],[3,2],[1,3],[3,1],[1,2],[2,1],[1,1]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM