List 如何在Haskell中通过有意列表创建特定长度的所有元素组合

List 如何在Haskell中通过有意列表创建特定长度的所有元素组合,list,haskell,List,Haskell,我想问一下,如何通过Haskell中的有意列表创建特定长度的元素的所有组合?以下是一个例子: 函数combo接受元素列表的两个参数-xs和value-n,目标是通过有意列表在长度为n的xs中创建所有可能的元素组合。 例如: 组合[1,2,3]2 应该回来 [1,1]、[1,2]、[1,3]、[2,1]、[2,2]、[2,3]、[3,1]、[3,2]、[3,3]] 提前感谢您的帮助这可以使用组合数学库来完成,但也可以自己轻松完成。 我举了一个小例子: import Data.List permu

我想问一下,如何通过Haskell中的有意列表创建特定长度的元素的所有组合?以下是一个例子: 函数combo接受元素列表的两个参数-xs和value-n,目标是通过有意列表在长度为n的xs中创建所有可能的元素组合。 例如: 组合[1,2,3]2 应该回来 [1,1]、[1,2]、[1,3]、[2,1]、[2,2]、[2,3]、[3,1]、[3,2]、[3,3]]


提前感谢您的帮助

这可以使用组合数学库来完成,但也可以自己轻松完成。 我举了一个小例子:

import Data.List

permutations' _ [] = []
permutations' 0 _  = []
permutations' n xs | n > length xs = error "n can't be larger than length of input"
                   | otherwise = permute n xs []

permute 0 xs ys = [ys]
permute n xs ys = concatMap (\x -> foo (n-1) (x `delete` xs) (ys ++ [x])) xs
“魔法”发生在一个简单的组合数学被应用的地方。 您从一个空的解决方案列表开始,该列表一直扩展到字符限制
n
。输入xs.g.[1,2,3]被映射,因此xs中的每个字符都被送入lambda函数。在lambda中,x附加到已经存在的结果。在第一个循环中,ys为空,因此只添加x。在随后的置换调用中,xs列表被收缩,ys被附加上xs被收缩的值。因此,增加结果直到达到字符限制,然后从xs中删除字符以防止重复条目

permute 2[1,2,3][
的演练可能如下所示:

(\1 -> foo (2-1) [2,3] [] ++ [1])
  - (\2 -> foo (1-1) [3] [1] ++ [2])
    - [1,2], since we hit the first pattern where n = 0
  - (\3 -> foo (1-1) [2] [1] ++ [3])
    - [1,3], since we hit the first pattern where n = 0
(\2 ....
(\3 ....

你尝试了什么,什么不起作用?什么是“有意列表”?[(x,y)| x@dfeuer:我猜它有点像其他语言中的生成器。啊哈,那么列表理解吧。