gpt4 book ai didi

haskell - 如何在 Haskell 中将守卫与模式匹配结合起来? (我可以吗?)

转载 作者:行者123 更新时间:2023-12-02 18:04:23 26 4
gpt4 key购买 nike

现在我知道在使用 Haskell 声明函数签名后,我可以像这样使用函数重载进行模式匹配:

frog :: Int -> String
frog 1 = "Ribbit"
frog 7 = "Croak"
frog 12 = "Pop!"
frog x = replicate x "Z"

我知道我也可以以类似的方式使用守卫:

frog :: Int -> String
frog x =
| x == 1 = "Ribbit"
| x == 7 = "Croak"
| x == 12 = "Pop!"
| otherwise = replicate x "Z"

不过,我宁愿将这两种方式结合起来,使用 bool 值守卫和模式来确定将执行哪个 ARM 。类似于此 Rust 代码段的内容:

fn frog(x: u32) -> String {
match x {
k if k >= 1000 => todo!()
k if k >= 100 => todo!()
k if k >= 10 => todo!()
9 | 8 | 7 => todo!()
6 | 5 | 4 => todo!()
3 => todo!()
2 => todo!()
1 => todo!()
0 => todo!()
}
}

我想知道在 Haskell 中是否可以做到这一点,如果可以,该怎么做。提前谢谢你

最佳答案

你不能用一个模式匹配多个案例(你的 Rust 代码中的 9 | 8 | 7 东西),但你可以直接组合模式和守卫:

foo 1 = "one"
foo 2 = "two"
foo k
| k > 1000 = "greater than 1000"
| k > 100 = "between 100 and 1000"
| otherwise = "some other number"

守卫是模式的一部分 - 如果没有一个附加到案例的守卫成功,那么控制权就会按照您期望的方式落到下一个案例。 (换句话说,单一模式的守卫不一定是详尽无遗的。)

bar k | k > 1000 = "greater than 1000"
bar _ = "smaller than 1000"

关于haskell - 如何在 Haskell 中将守卫与模式匹配结合起来? (我可以吗?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73638718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com