我有点困惑。在 Haskell 中定义普通的递归函数是没有问题的。同时,还有fix
通过定点定义递归 lambda 的标准函数。但是,与直接调用自身的常规递归函数相比,像这样定义的递归 lambda 除了可读性较差之外,还有应用程序开销。那么我在哪里实际上需要递归 lambda 和fix
?
问问题
158 次
1 回答
8
你永远不需要它。不过,有时它有点方便。
foo = do
foo1
x <- foo2
let loop = do
y <- bar x
if pred y then loop else return y
z <- loop
foo3 z
对比
foo = do
foo1
x <- foo2
z <- fix $ \loop -> do
y <- bar x
if pred y then loop else return y
foo3 z
我发现第二个有点不那么麻烦。这是一件小事,但我认为它很奇怪(即,比那个例子更复杂,不太可能是已经存在于库中的东西)单子循环看起来足够好,以至于我值得使用那个成语。我也喜欢它避免将另一个名称绑定到do
块的上下文中。
于 2013-10-30T05:20:40.117 回答