Haskell中能否结合守卫(Guards)与模式匹配?如何实现?
在Haskell中结合模式匹配与布尔守卫实现分支逻辑
完全可行,Haskell支持同时使用模式匹配与布尔守卫来构建分支逻辑,和你给出的Rust代码风格非常接近,主要有两种实现方式:
方式一:使用case表达式(最接近Rust的match)
case表达式是Haskell中实现多分支匹配的核心语法,你可以在模式后直接添加守卫条件,写法和Rust的match几乎一致:
frog :: Int -> String frog x = case x of k | k >= 1000 -> "对应todo的逻辑" k | k >= 100 -> "对应todo的逻辑" k | k >= 10 -> "对应todo的逻辑" k | k `elem` [7,8,9] -> "对应todo的逻辑" k | k `elem` [4,5,6] -> "对应todo的逻辑" 3 -> "对应todo的逻辑" 2 -> "对应todo的逻辑" 1 -> "对应todo的逻辑" 0 -> "对应todo的逻辑"
- 这里的
k | 条件就是带守卫的模式,等价于Rust中的k if 条件; - 对于多个值共享同一逻辑的场景(比如Rust中的
9 | 8 |7),Haskell没有直接的模式或语法,但可以用elem函数结合守卫来实现,也可以拆分成多个独立的模式子句。
方式二:使用多函数子句结合模式与守卫
你也可以将分支拆成多个函数定义,在模式匹配的同时添加守卫,Haskell会按从上到下的顺序匹配分支:
frog :: Int -> String frog k | k >= 1000 = "对应todo的逻辑" frog k | k >= 100 = "对应todo的逻辑" frog k | k >= 10 = "对应todo的逻辑" frog 9 = "对应todo的逻辑" frog 8 = "对应todo的逻辑" frog 7 = "对应todo的逻辑" frog 6 = "对应todo的逻辑" frog 5 = "对应todo的逻辑" frog 4 = "对应todo的逻辑" frog 3 = "对应todo的逻辑" frog 2 = "对应todo的逻辑" frog 1 = "对应todo的逻辑" frog 0 = "对应todo的逻辑"
这种写法更符合Haskell的函数式风格,每个分支都是一个独立的函数子句,匹配顺序和case表达式一致——先检查带守卫的子句,再匹配具体的模式。
内容的提问来源于stack exchange,提问作者Nikolai Savulkin
相关产品推荐
相关产品推荐

