我需要使用模式匹配技术,以递归方式交换列表中的每对元素。因此,[1, 2, 3, 4, 5]
会返回[2, 1, 4, 3, 5]
。
我发现了两件事:
List.length
:返回长度。这有助于处理偶数/奇数列表。List.nth
:在列表中的指定位置返回值。drop.(list, i)
:在删除第一个i元素后返回值。使用这三件事,我可以找出一些递归方法,但我不了解模式匹配方面。下面是一些没有任何模式匹配的伪代码。
function(list):
var a = first on list
var b = second on list
// odd case
if(b = null | "")
{
list = drop.(list, 1) @ a
}
// even case
else if(b = "" & a = "")
{
list = list
}
// recursive case
else
{
list = function(drop.(list, 2) @ b @ a)
}
这实际上可以开始循环遍历列表,交换对,将它们连接(连接)在列表的末尾,并递归地重复它直到它遍历所有对。
答案 0 :(得分:0)
函数List.length
,List.nth
和List.drop
似乎可以解决您的任务,但这对您使用模式匹配的目标起反作用。通过模式匹配,您使用该列表的是代数数据类型,类似于
datatype 'a list = [] | :: of 'a * 'a list
为空列表生成值构造函数[]
,为 cons 为现有列表前面的元素生成中缀::
运算符(即空的或以相同的方式创建),还有模式构造函数,用于识别您正在处理的列表类型。
示例:一个获取整数列表并对它们求和的函数:
fun sum [] = 0
| sum (x::xs) = x + sum xs
示例:一个函数,它接受一个2元组的列表,并返回一个类似的2元组列表,但每个2元组中的元素都被交换:
fun swap [] = []
| swap ((x,y)::xys) = (y,x)::swap xys
示例:一个函数,它采用一个偶数大小的整数列表,并返回一个列表,它们已成对添加到一起:
fun addpairs (x::y::xys) = x + y :: addpairs xys
| addpairs [_x] = raise Fail "Odd-sized list"
| addpairs [] = []
特别是,模式可以嵌套((x,y)::xys
~~"列表中至少有一个元素,其中第一个元素是2元组,第一个元素名为x
第二部分名为y
"和x::y::xys
~~"列表中至少有两个元素,第一个元素名为x
,第二个元素名为y
")和订单(从上到下匹配)可能很重要,如果模式重叠(他们不会在上述任何一个方面)。