为什么 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 值。
我正在尝试创建一个迭代函数,该函数接受一个 '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 值。