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.