gpt4 book ai didi

layout - 在 Haskell 中,对于递归函数使用守卫比模式更好吗?

转载 作者:行者123 更新时间:2023-12-01 20:06:41 25 4
gpt4 key购买 nike

我只是想知道我在 Haskell 中布置的递归函数。对于递归函数来说,使用防护通常比使用模式更好吗?

我只是不确定最好的布局是什么,但我确实知道在定义这样的函数时模式更好:

units :: Int -> String

units 0 = "zero"
units 1 = "one"

更倾向于

units n
| n == 0 = "zero"
| n == 1 = "one"

我只是不确定在递归方面这是相同还是不同。

只是不太确定术语:我正在使用这样的东西:

f y [] = [] 
f y (x:xs)
| y == 0 = ......
| otherwise = ......

或者这样会更好吗?

f y [] = [] 
f 0 (x:xs) =
f y (x:xs) =

最佳答案

我的一般经验法则是:

  • 当防护是一个简单的 == 检查时,请使用模式匹配。

通过递归,您通常会检查基本情况。因此,如果您的基本情况是简单的 == 检查,则使用模式匹配。

所以我通常会这样做:

map f [] = []
map f (x:xs) = f x : map f xs

而不是这个(null只是检查列表是否为空。它基本上是== []):

map f xs | null xs   = []
| otherwise = f (head xs) : map f (tail xs)

模式匹配的目的是让你的生活更轻松,恕我直言,所以最终你应该做对你有意义的事情。如果您与一个团队一起工作,那么就做对团队有意义的事情。

[更新]

对于您的具体情况,我会这样做:

f _ []      = []
f 0 _ = ...
f y (x:xs) = ...

模式匹配就像守卫一样,从上到下下降,在第一个与输入匹配的定义处停止。我使用下划线符号来指示对于第一个模式匹配,我不关心 y 参数是什么,对于第二个模式匹配,我不关心列表参数是什么(不过,如果您在该计算中使用列表,则不应使用下划线)。由于它仍然是相当简单的类似 == 的检查,因此我个人会坚持使用模式匹配。

但我认为这是个人喜好的问题;您的代码完全可读且正确。如果我没记错的话,当编译代码时,守卫和模式匹配最终都会变成 case 语句。

关于layout - 在 Haskell 中,对于递归函数使用守卫比模式更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6077169/

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