sách gpt4 ai đã đi

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

In lại 作者:行者123 更新时间:2023-12-02 01:29:34 26 4
mua khóa gpt4 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 中是否可以做到这一点,如果可以,该怎么做。提前谢谢你

1 Câu trả lời

你不能用一个模式匹配多个案例(你的 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
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com