模式匹配涵盖多种情况

Setzer22

我做了一个比较字符串的函数(当然,这是我要学习的一种练习,并且我很清楚<,>运算符都适用于大多数现代语言的字符串)。为了进行一些递归,我对功能使用模式匹配,但是我不确定到底发生了什么。这是我的代码:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

模式匹配涵盖多种情况

来自分类Dev

PERL:匹配多种模式

来自分类Dev

python列表匹配多种模式

来自分类Dev

匹配野牛中的多种模式

来自分类Dev

多种模式匹配并单行打印

来自分类Dev

多种模式匹配和替换

来自分类Dev

Unix匹配多种模式返回成功

来自分类Dev

Scala模式匹配多种类型

来自分类Dev

很多嵌套的匹配...模式匹配的情况

来自分类Dev

切换以匹配OptionSetType中的多种情况

来自分类Dev

使用多种匹配模式对字符串列进行标记/分类

来自分类Dev

Perl中的字符串匹配用于多种模式

来自分类Dev

多种情况

来自分类Dev

多种模式

来自分类Dev

模式匹配情况下的统一

来自分类Dev

哪种模式匹配算法适合我的情况?

来自分类Dev

在模式匹配的默认情况下,如何访问匹配值?

来自分类Dev

正则表达式特殊情况:不匹配匹配模式中的垂直模式

来自分类Dev

Golang正则表达式以匹配关键字对之间的多种模式

来自分类Dev

如何匹配多种模式并使用sed更改一个零件

来自分类Dev

在Java正则表达式中使用多种模式获取重叠匹配

来自分类Dev

如何使用C ++ 11正则表达式匹配多种替代模式之一

来自分类Dev

使用case_when进行字符串匹配的多种模式

来自分类Dev

如何以多种顺序将多个不同模式与一个匹配出现?

来自分类Dev

如何匹配多种模式并使用sed更改一个零件

来自分类Dev

在具有多种数据类型的ADT上更精确的模式匹配?

来自分类Dev

php preg_match有条件地匹配多种模式

来自分类Dev

sed在存在未知字符的情况下不匹配模式

来自分类Dev

Makefile在奇怪的情况下拒绝匹配目标模式