我想知道带卫兵的功能是否可以尾递归。鉴于elem
的实现,例如
elem' :: (Eq a) => a -> [a] -> Bool
elem' x [] = False
elem' x (y:ys)
| x == y = True
| otherwise = elem' x ys
这个尾部是递归的吗?我会说是的,但我不知道怎么说。
答案 0 :(得分:9)
是的,它是尾递归的。
“尾递归”在Haskell上下文中的一个可能定义是对“连接点”的调用是有效的,因为它们可能只出现在尾递归位置。 在Compiling without Continuations的第3页,我们找到了这个数字:
我们看到案例陈述中的替代品的右侧是尾部调用头寸。我们也可以在GHC源中找到与此相对应的代码。
与desugaring of guards according the Haskell report一起告诉我们守卫基本上是嵌套的case
- 表达式,我们可以得出结论,你的函数是尾递归的。
(虽然应该说“elem'
作为两个参数的函数是尾递归的” - 没有指定arity,问题就没那么明了。)