我正在尝试创建一个带有'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/