我做了一个比较字符串的函数(当然,这是我要学习的一种练习,并且我很清楚<,>运算符都适用于大多数现代语言的字符串)。为了进行一些递归,我对功能使用模式匹配,但是我不确定到底发生了什么。这是我的代码:
compareStrings :: String -> String -> Char
compareStrings (x:xs) (y:ys)
| x > y = '>'
| x < y = '<'
| x == y = compareStrings xs ys
compareStrings [a] [b]
| a < b = '<'
| a > b = '>'
| a == b = '='
因此,在很多情况下,我的代码中都没有涉及到,例如一个空列表和一个单例列表,以及一个空列表和一个普通列表(多个元素)。当然,它也是对称的。如何确定我全部检查了?是不是有些事情发生了,还是只是在某个时候比较字符串(不是字符,这是我的意图)而我不知道呢?
对于这样的问题,您只关心每个列表的第一个元素,如果列表为空。通常,您只需要确定函数在操作列表的哪些元素,然后处理大小写,直到覆盖了可以传递的任何类型的列表。
对于此实例,您要处理两个列表都具有数据(x:xs)
和(y:ys)
,以及其中一个或两个都为空的情况。你可以用
-- Both are empty
compareStrings [] [] = '='
-- The first is empty, the second is not
compareStrings [] ys = '<'
-- The first is not empty, the second is
compareStrings xs [] = '>'
-- Both have data
compareStrings (x:xs) (y:ys) = <your current implementation>
请注意,在前两种情况下,我们不必指定包含数据的列表实际上具有数据,因为如果它通过了第一个模式,那么两者都不为空。如果您有not (xs == [] && ys == []) && (xs == [] && ys == _)
(这不是代码,请不要尝试运行),则ys
不是[]
。我们也没有检查的情况下xs == [x] && ys == [y]
,因为[x] == x:[]
它匹配(z:zs)
与x == z
和[] == zs
。
为了确保您确实涵盖了所有模式,应-fwarn-non-exhaustive-patterns
按照@StephenDiehl的建议启用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句