Haskell置换功能

问题描述

这是我对此网站的第一个问题。因此,如果我粗鲁或不够正式,对不起。
在我的离散数学课上,教授向我们展示了这种置换函数

permute :: [a] -> [[a]]
permute [] = [[]]
permute xs = [y:zs| (y,ys) <- select xs,zs <- permute ys]

select :: [a] -> [(a,[a])]
select [] = []
select (x:xs) = (x,xs) : map(\(y,ys) ->(y,x:ys))(select xs)

我不明白这部分

permute xs = [y:zs| (y,zs <- permute ys]

我尝试permute [1]来清楚地理解,在第一次递归中,select xs接受了[1]并返回了[(1,[])]。然后,如果我没有记错的话,permute ys就拿[]

在第二个递归中,select[]并返回[]。我在这里某处迷路了。如我所见,它应该返回[[1],[]],但它返回[[1]]
如果有人帮助,我会很高兴。

解决方法

如果您呼叫> rowSums(matrix(as.matrix(df) %in% c("A","B"),nrow=nrow(df),dimnames= list(df$query,NULL))) #> SP1 SP2 SP3 SP4 #> 3 1 1 0 ,则permute [1]将返回select [1],这意味着列表解析将花费[(1,[])]y = 1。然后我们调用ys = [],它返回permute []。因此,这意味着[[]]仅会占用zs。因此,我们将产生zs = [],它等效于[ y : zs ],也就是[ 1 : [] ]

因此,由于[[]]等于zs <- permute [],因此这意味着它仅使用zs <- [[]]进行一次迭代。

如果您zs = [],我们将因此呼叫permute [1,2],并返回select [1,2]。因此,这意味着在列表理解中,[(1,[2]),(2,[1])]将“迭代”两次:一次使用(y,ys)y=1;然后使用ys=[2]y=2。然后,对于ys=[1]的每个值,它将调用(y,ys)permute将返回permute [1],而[[1]]将返回permute [2]。因此,这意味着我们将返回包含以下内容的列表:[[2]],因此等效于[ 1 : [2],2 : [1]]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...