微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Haskell置换功能

如何解决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]]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。