Types 为什么ReasonML抛出此类型错误?

Types 为什么ReasonML抛出此类型错误?,types,compiler-errors,reason,type-signature,Types,Compiler Errors,Reason,Type Signature,我正在尝试创建一个迭代函数,它接受一个'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){ |

我正在尝试创建一个迭代函数,它接受一个
'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(迭代(f,n-1))


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

在第二个分支中,你给出了递归调用
迭代
的结果,根据您的类型注释返回一个函数。因此
'a
必须是一个函数
'a=>'b
。另外,如果您直接返回调用
f
的结果,那么该结果也必须是一个函数,因为
iterate
应该返回这个结果


因此,您不能直接返回应用
f
的结果。您必须返回一个调用
f
并带有给定值的函数,然后将其返回值传递给递归调用
iterate
返回的函数(或以其他方式),然后返回该值。

您不需要告诉它操作什么。而且类型签名很好。由于curry,编译器向您显示的是一个等价的类型签名。代码唯一的错误是最后一个分支。请尝试将
'a.
添加到类型签名中。它将使
'a
显式多态,从而提供更好的错误消息:
'a。('a=>'a,int)=>('a=>'a)
x=>f(f(x))
具有与
f
相同的类型签名,但调用了两次
x=>f(f(f(x)))
调用它三次。现在你只需要弄清楚如何在那里递归调用
迭代
。请不要破坏你的帖子为别人做更多的工作。通过在Stack Exchange(SE)网络上发布,您已经在a下授予SE分发内容的不可撤销权利(即,无论您未来的选择如何)。根据SE政策,分发非故意破坏版本。因此,任何故意破坏行为都将恢复原状。请参阅:。如果允许删除,在帖子下方左侧有一个“删除”按钮,但它仅在浏览器中,而不是在移动应用程序中。你不允许实质性地更改你的问题。如果您有后续问题,请提出新问题。
This expression has type 'a => 'b but an expression was expected of type ('a => 'b, 'a) => 'b.