为什么 ReasonML 会抛出这种类型的错误?

Why is ReasonML throwing this type error?

我正在尝试创建一个迭代函数,该函数接受一个 'a => 'a 函数,以及一个指示该函数迭代多少次的自然数。它将输出另一个 'a => 'a 函数。 输入示例:

let func: int => int = num => x-2;

iterate(func, 3) 会输出 func(func(func()))x-6

但是,我有这个代码

let rec iterate: ('a => 'a, int) => ('a => 'a) = (f, n) =>
switch(n){
    | 1 => f
    | x when x > 1 => f(iterate(f, n-1))
};

它在 f(iterate(f, n-1))

下给我这个错误
This expression has type 'a => 'b but an expression was expected of type ('a => 'b, 'a) => 'b.

编辑:我相信这与编译器出于某种原因将第一行中的类型签名读取为 ('a => 'a, int, 'a) => 'a 有关,我不知道为什么会这样读取它。

在第二个分支中,您给 f 递归调用 iterate 的结果,根据您的类型注释,return 是一个函数。因此 'a 必须是函数 'a => 'b。此外,如果您 return 直接调用 f 的结果,则该结果也必须是一个函数,因为那是 iterate 应该 return.

所以你不能return直接应用f的结果。您必须 return 一个函数,该函数使用给定的值调用 f,然后将其 return 值传递给函数 returned 从对 [=11 的递归调用=](或相反),然后 returns that 值。