如何解决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 举报,一经查实,本站将立刻删除。