非穷举模式n元组函数



我在大学里做了一个基于改变图像像素的程序。

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

我将[String]与三元组列表中的所有像素进行转换,然后将所有像素更改为红色,但当我执行程序时,似乎出现了反模式问题,终端上的错误是"函数到红色的非穷举模式">

还有红色的功能

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

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

您正在匹配两种情况:

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

这留下了两种你没有匹配的情况:

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

请记住,以上只是案例的局部描述。由于您的函数是递归的,每次递归时都会减去三个元素,因此这些情况实际上分别转换为"长度为3n+1的列表"one_answers"长度为2n+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 _ = [] 

最新更新