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

时间:2019-12-10 23:52:51

标签: types compiler-errors reason type-signature

我正在尝试创建一个包含{"id":275,"method":"setValue","params":"50.00"}* Closing connection 0 函数的迭代函数和一个自然数,该自然数指示对该函数进行多少次迭代。它将输出另一个'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更改为

iterate

编译器显示

let rec iterate = (f: 'a => 'a, n: int): ('a => 'a) => f;

1 个答案:

答案 0 :(得分:0)

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

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