在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元组)。

对于包含至少一个元素的列表,有两种情况:

  1. 我们选择第一个元素,然后使用尾部作为其余元素的列表;和
  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),因此该列表位于二元组的第二项。

相关问答

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