【发布时间】:2021-12-29 20:06:21
【问题描述】:
当您在 do 块中时,为了模拟“while 循环”,通常会看到人们在 let 语句中声明“循环”函数。但是,有一个聪明的函数“修复”,它允许您同时声明和使用该函数
main = do
let fac n r = if n == 1 then r else fact (n-1) (n*r)
print $ fact 4 1 -- 24
print $ fix (\rec n r -> if n == 1 then r else rec (n-1) (n*r)) 4 1
问题是,fix 比使用 let 语句有什么优势吗? 是更慢还是使用更多内存?
【问题讨论】:
-
我隐约记得在某处读到 GHC 在优化非递归函数方面比递归函数做得更好。 (这里的“递归”是对其静态属性的引用;
fix的参数本身不是递归的,因为它调用作为其第一个参数传递的任何函数,不一定是它自己。)