如何解决在Haskell中选择配对函数
select :: [a] -> [(a,[a])]
select [] = []
select (x:xs) = (x,xs) : map(\(y,ys) ->(y,x:ys))(select xs)
map(\(y,x:ys))(select xs)
我实际上不了解这部分的作用
\(y,x:ys)
解决方法
select
返回给定的2元组列表,其中每个项目的第一项是所选项目,第二项是除所选元素之外的所有元素的列表。
所以这意味着:
Prelude> select [1,4,2,5]
[(1,[4,5]),(4,[1,(2,(5,2])]
对于空列表,由于不能选择单个元素,因此我们返回一个空列表(2元组)。
对于包含至少一个元素的列表,有两种情况:
- 我们选择第一个元素,然后使用尾部作为其余元素的列表;和
- 我们选择另一个元素。我们可以在尾部递归,从而从尾部选择一个元素,但是尾部当然不包含该元素,即剩余元素列表的头部。稍后我们需要将
x
添加到所有项目中。
我们可以通过在x
之前添加到其余元素的每个列表的映射来做到这一点。
例如,如果我们执行select [1,4]
,那么我们将获得具有以下内容的第一个元素:
select [1,4] = (1,[4]) : map (\(y,ys) -> (y,x : ys)) (select [4])
select [4]
将返回:
select [4] = (4,[]) : map (\(y,ys) -> (y,x : ys)) (select [])
选择一个空列表将返回一个空列表,这意味着:
select [4] = (4,x : ys)) []
因此:
select [4] = (4,[]) : []
等效于:
select [4] = [(4,[])]
对于select [1,4]
,我们获得:
select [1,x : ys)) [(4,[])]
因此,我们需要将1
添加到空列表中,我们通过映射来完成操作,从而获得:
select [1,[4]) : [(4,[1])]
因此等同于:
select [1,4] = [(1,[4]),[1])]
\(y,ys) ->(y,x:ys)
因此是一个 lambda表达式,该表达式将2元组(y,ys)
映射到2元组(y,x : ys)
,因此该列表位于二元组的第二项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。