具有输出列表长度的 Haskell 排列

标签 haskell functional-programming

我有这样的代码来创建排列:

--unique permutation
perm :: [t] -> [[t]]
perm [] = [[]]
perm (x:xs) = [(y:zs) | (y,ys) <- views (x:xs), zs <- perm ys]

--create all possible views
views :: [t] -> [(t,[t])]
views [] = []
views (x:xs) = ((x,xs) : [ (y,(x:ys)) | (y,ys) <- views xs ])

但是我想将输出限制在一定长度内。例如,它应该采用一个参数来指定排列输出中元素的数量。我想创建从列表 [0..9] 中提取的 k 个不同的排列。 因此,例如,如果 k 等于 3,则输出应如下所示:[1,2,3]、[9,8,7]、[0,6,8] 等。

现在,如果我将 [0..9] 传递给函数,它将生成一个排列长度为 10 的列表。我正在努力想出一个解决方案。 最后,该函数应该类似于 perm k list 谢谢!

它与这个问题有关:Verbal Arithmetics in Haskell (SEND + MORE = MONEY)

最佳答案

你的意思是这样的吗?

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]]

关于具有输出列表长度的 Haskell 排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35118659/

相关文章:

haskell - Haskell 的 Foldable 和 Traversable 相当于 Clojure 中的一个序列吗?

java - 如何在Java 8中检查Stream对象的内容而不转换为数组?

haskell - isLeft 有效,但 fromLeft 在 haskell 中不起作用

haskell - F# 类型声明可能是 Haskell 吗?

haskell - 如何获取真实值遵循伯努利分布的 bool 值列表

haskell - 使用通用量化约束重写规则/特化类型错误

haskell - 超时时如何重试阻塞IO Action?

javascript - 带状态的 ifElse 语句?

java - 使用选项类型是否不需要 if 语句?

scala - 如何组合 Kleisli[M, A, C] 和 Kleisli[M, B, C]