fix
定义为:
fix :: (a -> a) -> a
fix f = let x = f x in x
因此它扩展为输入函数对某个参数f (f (f (f ...)))
的无限嵌套应用序列。f
x
您可以为您的 lambda 函数提供顶级定义,例如
factF f n = if n == 0 then 1 else n * f (n - 1)
或等效地:
factF :: (Int -> Int) -> (Int -> Int)
factF f = \n -> if n == 0 then 1 else n * f (n - 1)
您可以提供此功能fix
以获取功能,(Int -> Int)
即
fact :: (Int -> Int)
fact = fix factF
如果你扩展这个定义,你会得到
factF (factF (factF (factF ...)))
=> \n -> if n == 0 then 1 else (factF (factF (factF ...)))
由于懒惰,factF
只有当n /= 0
上述函数应用于0
将立即评估为 1 时,才会评估 的重复应用。
您可以在这个扩展中看到,它factF
作为一个参数提供给它自己,然后它适用于较小版本的n
. 由于factN
与您的 lambda 函数相同,因此在那里发生了同样的事情 - f
lambda 内部的参数是 lambda 本身,然后它可以递归调用。