我在大学里做了一个基于改变图像像素的程序。
但是我不知道如何解决这个问题。
我将[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 _ = []