非穷尽模式n元组函数

时间:2018-12-10 03:04:24

标签: haskell tuples

我已经基于更改图像像素完成了上大学的程序。

但是我不知道如何解决这个问题。

我将三元组列表中的所有像素转换为[String],然后将所有像素更改为Red,但是当我执行程序时,de模式似乎是一个问题,终端上的错误是 “函数toRed中的非穷举模式”

并具有toRed的功能

toRed :: [String] -> [(String, String, String)]
toRed [] = []
toRed (x:y:z:xs) = (x,"0","0") : toRed xs

程序执行并保存outFile,但不要转换所有文件

1 个答案:

答案 0 :(得分:5)

您要匹配两种情况:

  • 空列表-[]
  • 具有至少三个元素的列表-x:y:z:xs

这留下了两个您不匹配的情况:

  • 仅包含一个元素的列表-[x]
  • 包含两个元素的列表-[x, y]

请记住,以上只是案例的 local 描述。由于您的函数是递归的,并且每次重复都会减去三个元素,因此这些情况实际上会转换为“ 长度为3n + 1 的列表”和“ 长度为3n + 2的列表” ”。

在这种情况下,我无法确切告诉您该怎么做,因为我不知道您的问题的性质,但是包括它们可以防止错误。

例如,您可能希望以与对待空列表完全相同的方式对待这两种情况:

toRed :: [String] -> [(String, String, String)] 
toRed [] = [] 
toRed [x] = [] 
toRed [x, y] = [] 
toRed (x:y:z:xs) = (x,"0","0") : toRed xs

如果以这种方式处理这些案例对您有意义,那么您可能需要考虑将所有三个“空”案例合并为一个通用案例:

toRed :: [String] -> [(String, String, String)] 
toRed (x:y:z:xs) = (x,"0","0") : toRed xs
toRed _ = []