Function 如何创建haskell置换

Function 如何创建haskell置换,function,haskell,boolean,permutation,Function,Haskell,Boolean,Permutation,我想做的是创建一个给定一定长度的函数,创建所有可能的真/假组合/排列 例如,getPerm 2应返回[真、真、真、假、假、真、假、假] getTrue 0 = [] getTrue size = (True:(getTrue (size-1)))++(True:(getFalse (size-1))) getFalse 0 = [] getFalse size =(False:(getTrue (size-1)))++(False:(getFalse (size-1))) getPerm 0 =

我想做的是创建一个给定一定长度的函数,创建所有可能的真/假组合/排列

例如,
getPerm 2
应返回
[真、真、真、假、假、真、假、假]

getTrue 0 = []
getTrue size = (True:(getTrue (size-1)))++(True:(getFalse (size-1)))
getFalse 0 = []
getFalse size =(False:(getTrue (size-1)))++(False:(getFalse (size-1)))
getPerm 0 = []
getPerm size= (getTrue size)++(getFalse size)

我对函数式编程不太熟悉,所以请只使用基本的东西,不要使用奇怪的东西尽量使代码简单,因为我对haskell还不太了解

getPerm = concat . sequence . flip replicate [True,False]
如果您希望所有排列都有不同的列表,只需删除
concat

我只是想到了一个更基本的定义<代码>迭代::(a->a)->a->[a]反复应用函数并返回中间值:

getPerm = concat . (iterate permute [[]] !!)

permute xs = map (True:) xs ++ map (False:) xs
因此,基本上,
permute
生成下一个置换,而
getPerm
只选择所需的置换

getPerm n = concat $ replicateM n [True, False]

虽然这可能是一件“奇怪的事情”,但并不难<代码>[True,False]表示列表单子中的非确定性选择<代码>复制项生成一个不确定的列表,列出这些选择的重复。因为您希望将它们都放在一个列表中,所以我们将它们连接起来以获得最终结果。

这里是另一个透视图

getPerm n
将创建2^n个置换。生成这些值的另一种方法是简单地从0到2^n-1计数,并将位模式编码为
True
False

我已经更改了
getPerms
函数的类型,以返回列表列表,从而更容易将内容分解

import Data.Bits

getPerms :: Int -> [[Bool]]
getPerms n = map (encode n) [0..2^n-1]

encode :: Int -> Int -> [Bool]
encode bitSize value = map (testBit value) [0..bitSize-1]

*Main> getPerms 2
[[False,False],[True,False],[False,True],[True,True]]

我试过这句话,它奏效了,但你能解释一下吗?我不明白这是什么。到底是什么?!flip replicate有点清晰,您使用了Curry表示大小。
是函数组合。也就是说,
f。g=\x->f(gx)
replicItem
复制计算并将结果收集到列表中。例如,
replicitem 10 getLine
将读取10行并将它们收集到一个列表中。这里我在列表monad中使用它,因此它在
True
False
n次之间重复选择,并给出所有可能的结果列表。它本质上与fuzzxl的解决方案相同,因为
replicItem=sequence。复制
。您需要导入
控件。Monad
。好的,现在它可以工作了,但据我所知,从concat$replicateM n[True,False]行中,我复制了[True,False]n次,然后将它们合并到1个列表中,这将使模式结果类似于[True,False,True,False,False,True,False,…]工作不正常:D抱歉,我问了很多,但我真的很想学习:)好的,非常感谢,我在谷歌上搜索并理解了我想要的:)真的很有帮助,伙计们:DGood point。您可能需要添加,OP必须为
testBit
导入数据.Bits。