【发布时间】:2017-04-03 09:25:34
【问题描述】:
所以我正在阅读 Paul Hudak 的书“The Haskell School of Expression”,并在那里进行了一项练习。
来了
假设函数 fix 被定义为
fix f = f (fix f)
fix 的主要类型是什么? 我知道的那个是b -> b -> b
但是我不明白fix的定义方式,会不会进入无限递归?
另外,让remainder 函数定义为
remainder :: Integer -> Integer -> Integer
remainder a b = if a < b then a
else remainder (a - b) b
使用fix 重写remainder,使其非递归。
【问题讨论】:
-
fix的类型不是b -> b -> b。 -
不,是
(b -> b) -> b。 -
Haskell 使用惰性求值。
f (fix f)首先调用外部f,而不是fix。 -
对于许多函数
fix确实会进入无限递归而不返回。然而,对于许多人来说,它不会。例如fix (const 1)或fix (1:)。 -
很好,我看到它适用于 (1:) 和 (const 1)。它的 haskell 的懒惰评估 :)
标签: haskell recursion types infinite fixpoint-combinators