让我们再次评估它:
iter p f x = if (p x) then x else (iter p f (f x))
iter
接受三个参数(从技术上讲,每个函数都接受一个参数,但让我们跳过细节)。所以它确实有一个 type t1 -> t2 -> t3 -> t
。
现在在if
--语句中then
,else
我们看到(p x)
这意味着p x
必须评估为布尔值。这意味着:
t1 ~ t3 -> Bool
接下来我们x
在then
声明中看到。这可能并不重要,但它是:这意味着输出类型t
与 的相同t3
,所以:
t3 ~ t
现在这意味着我们已经派生了iter
具有以下类型的:
iter :: (t3 -> Bool) -> t2 -> t3 -> t3
现在我们在else
语句中看到调用:
iter p f (f x)
所以这意味着那f
是一个函数f :: t4 -> t5
。由于它x
作为输入,它的输入类型应该是t3
,并且由于结果(f x)
被传递给一个iter
函数(这本身不是相同的“接地”iter
函数)。所以我们必须检查调用:
iter :: (u3 -> Bool) -> u2 -> u3 -> u3 -- call
现在,既然我们用 with 调用它,iter p f (f x)
我们肯定知道u3 ~ t3
:因为p
has type t3 -> Bool
。因此,它进一步基于:
iter :: (t3 -> Bool) -> u2 -> t3 -> t3 -- call
正弦(f x)
用作第三个参数,我们知道结果的类型也f x
应该是t3
。f
类型也是如此f :: t3 -> t3
。因此我们得出结论,iter 具有以下类型:
iter :: (t3 -> Bool) -> (t3 -> t3) -> t3 -> t3