Haskell模式匹配:指定列表中的元素数

时间:2017-09-20 15:54:48

标签: haskell

所以我目前正在我的大学和Haskell一起工作,但有点挣扎于模式匹配,并且更具体地说我会给我的程序,我要解决的问题:

我的函数正在等待列表列表(每个列表包含至少3个元素),并且在每个列表中,第二个元素将替换为第三个元素的编号。

示例:

[[1,2,3],[4,5,6,7],[8,9,10]]应该成为[[1,3,3],[4,6,6,7],[8,10,10]

到目前为止,我已经做了以下事情:

 f [] = []
 f [[x]] = []
 f [[x,y]] = []
 f [[x,y,z]] = [[x,z,z]]
 f ([x,y,z]:xs) = [x,z,z]:f(xs)

我的问题是:

  1. 我如何识别,某些列表可能包含3个以上的元素,且列表必须保持不变,只有第2个元素发生变化。

  2. 如何进行递归,以便处理异常(例如,第一个列表有4个元素)。 提前谢谢你!

1 个答案:

答案 0 :(得分:0)

首先编写将第二个值与第三个值交换在列表中的函数可能会有所帮助。

swap (x:y:z:rest) = x:z:z:rest
swap xs = xs

在上面,x:y:z:rest匹配至少长度为3的列表。rest的值,因为它位于模式的末尾,将匹配任何类型的列表,包括空和充分。 xs的第二个模式匹配对于任何其他类型的列表都是一个包罗万象,如果它少于3个项目,它将返回相同的列表。

从那里开始,您可以在外部列表上映射并应用f时编写swap

f = map swap