Haskell中同一函数不同模式间共享变量的惯用方法
问题解答
你的case表达式解法是符合Haskell惯用写法的,完全合理。不过还有更直接的修正方式——调整where子句的缩进位置,让它属于整个doFoo函数而非仅最后一个模式分支:
doFoo :: ... doFoo pattern1 = fooHelper ... doFoo pattern2 = fooHelper ... where fooHelper = ...
这样fooHelper会被所有函数分支共享,无需改用case表达式。
关于你提到的模式匹配等效性:函数级多分支模式匹配确实和case表达式语义等价,编译器通常会把它们编译成相同的核心代码,两种写法在性能上没有差异。
如果fooHelper逻辑复杂,或者你希望它仅在doFoo作用域内存在,上述两种方式(修正缩进的where子句、case表达式+where)都是常用选择,具体可根据代码可读性需求选择:
- 当模式分支逻辑简单时,修正缩进的多分支写法更简洁;
- 当分支内部逻辑复杂,或需要在匹配前做公共预处理时,case表达式的写法结构更清晰。
内容的提问来源于stack exchange,提问作者thisisrandy
相关产品推荐
相关产品推荐

