Haskell,结合重复+;排列

Haskell,结合重复+;排列,haskell,Haskell,假设我有一个包含元素的列表,例如[1,2,3,4,5,6,7,8]。 我想创建长度为N的元素的所有排列 因此,对于N=4,它将是 [[1,1,1,1],[1,1,1,2],[1,1,2,1],[1,2,1,1],[2,1,1],…]等等 comb :: Int -> [a] -> [[a]] comb 0 _ = [[]] comb _ [] = [] comb m (x:xs) = map (x:) (comb (m-1) xs) ++ comb m xs 现在,为了先得到这个列

假设我有一个包含元素的列表,例如
[1,2,3,4,5,6,7,8]
。 我想创建长度为N的元素的所有排列

因此,对于
N=4
,它将是
[[1,1,1,1],[1,1,1,2],[1,1,2,1],[1,2,1,1],[2,1,1],…]
等等

comb :: Int -> [a] -> [[a]]
comb 0 _ = [[]]
comb _ [] = []
comb m (x:xs) = map (x:) (comb (m-1) xs) ++ comb m xs
现在,为了先得到这个列表,我找到了列表中所有重复的组合, 所以
[[1,1,1,1],[1,1,1,2],[1,1,1,3],[1,1,1,4],[1,1,1,5],…]
对于每个列表,我找到所有排列,如果排列不在列表中,我将其添加到列表中

permutations1 :: Eq a => [a] -> [[a]]
permutations1 []   = [[]]
permutations1 list = [(x:xs) | x <- list, xs <- permutations1 $ delete1 x list]

delete1:: Eq a => a -> [a] -> [a]
delete1 _ [] = [] 
delete1 a (b:bc) | a == b = bc 
                 | otherwise = b : delete1 a bc
permutations1::Eq a=>[a]->[a]]
置换1[]=[[]]
排列1列表=[(x:xs)| x[a]->[a]
删除1[]=[]
delete1a(b:bc)| a==b=bc
|否则=b:delete1 a bc
这就是我得到想要的答案的原因


我知道这真的(真的)很糟糕,但我对haskell的理解还不够,无法编写将这些函数组合在一起的函数。

这称为带替换的采样。。在haskell中,您可以利用列表的一元行为(即非确定性计算)

如果您想从5号人口中获得一个4号样本并进行替换,那么对于这4个项目中的每一个,您都有5个选择;因此您要将每个
[1..5]
复制4次,因此
复制项目4

(即
M
部分)表示应该能够将这些中间值绑定在一起


为非确定性建模。即,它表示每个项目都是非确定性的,但它可以是
[1..5]中的一个
值,并将它们绑定在一起,需要所有非确定性值的外积;因为如果您有4个项,每个项都有5个可能的值,那么您就有了
5^4
可能的最终输出。

谢谢您的回答!现在我确切地知道了我需要什么,所以我可以尝试理解它并编写自己的实现!
\> import Control.Monad (replicateM)
\> length $ replicateM 4 [1..5]   -- should output 5^4
625
\> replicateM 4 [1..5]
[[1,1,1,1],[1,1,1,2],[1,1,1,3],[1,1,1,4],[1,1,1,5],[1,1,2,1],[1,1,2,2],[1,1,2,3],[1,1,2,4],[1,1,2,5]] ....