为什么Haskell中函数的分段定义依赖于模式的声明顺序?
问题原因解析
Haskell 的函数多分支模式匹配遵循从上到下的优先级规则:输入参数会按照分支定义的先后顺序逐一校验,一旦命中某条分支,就会直接返回对应结果,不再校验后续分支。
第二种写法存在分支提前覆盖的问题:
- 首行的
pts x = x中,x属于万能匹配模式,所有合法输入都能匹配该分支 - 后续定义的
pts 1 = 10、pts 2 = 6两个分支永远没有被触发的可能,因此编译器会抛出-Woverlapping-patterns警告,将这两个分支判定为冗余代码直接忽略。
第一种写法则符合匹配逻辑:先定义特殊值 1、2 的匹配分支,最后放置万能匹配的兜底分支,不会出现分支被提前覆盖的问题。
如果需要更清晰地表达匹配逻辑,也可以用 case 表达式统一编写:
pts x = case x of 1 -> 10 2 -> 6 _ -> x
内容的提问来源于stack exchange,提问作者Evgeniy Tishin
相关产品推荐
相关产品推荐

