我正在尝试创建一个带有'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的结果,根据您的类型注释,该结果将返回一个函数。因此,'a必须是函数'a => 'b。同样,如果直接返回调用f的结果,则该结果也必须是一个函数,因为iterate应该返回该结果。

因此,您无法直接返回应用f的结果。您必须返回一个函数,该函数使用给定的值调用f,然后将其返回值传递给从对iterate的递归调用返回的函数(或相反),然后返回该值。

关于types - 为什么ReasonML抛出此类型错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59277027/

10-10 14:37