关于Haskell中prefix前缀判断与substring子串判断函数的相关疑问
关于Haskell
prefix与substring函数的疑问解答 prefix函数疑问解答
问题1:模式匹配返回值设计逻辑
Haskell的函数模式匹配会从上到下依次匹配,当两个入参均为空字符串时,会优先匹配到第一个分支prefix [] _,直接返回True,完全符合「空字符串是空字符串的前缀」的定义,不存在逻辑冲突。
该分支设计严格遵循字符串前缀的通用定义:
- 空字符串是任意字符串的前缀,所以只要第一个参数为空,不管第二个参数是什么都返回True
- 第二个分支
prefix _ []仅会在「第一个参数非空,第二个参数为空」的场景下触发,非空字符串不可能是空字符串的前缀,因此返回False
问题2:执行逻辑理解是否正确
你的理解完全正确。prefix的完整执行逻辑为:
- 优先处理边界情况:待判断前缀为空直接返回True,原字符串为空但前缀非空直接返回False
- 边界条件未触发时,取出两个字符串的首字符判断是否相等,若相等则递归对两个字符串的剩余部分重复上述判断
substring函数疑问解答
问题1:整体运行逻辑
该函数实现的是滑动窗口检查子串的逻辑:
- 首先做边界校验:如果待检查子串
x的长度大于原字符串y,直接返回False - 边界校验通过后,先判断
x是不是当前y的前缀:如果是直接返回True - 如果不是前缀,就把
y去掉首字符得到新的字符串,递归调用substring检查x是不是新字符串的子串
相当于每次把检查窗口向后滑动一位,直到匹配到前缀,或者y被缩短到比x短为止。
问题2:x长度大于y时直接返回False的原因
子串的定义是原字符串中连续的一段字符,它的长度不可能超过原字符串的总长度。这一步是提前剪枝,既符合子串的基本逻辑,也能避免不必要的递归调用,提升运行效率。
内容的提问来源于stack exchange,提问作者Quin
相关产品推荐
相关产品推荐

