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

标签 types compiler-errors reason type-signature

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

相关文章:

java - java 中的原始数据类型转换 - 内部逻辑

types - 映射类型的实体大小

typescript : "Resolve"条件类型

Scala:使用协变 Field[+T] 访问属性

f# - Ocaml 中是否有单个案例变体的用例?

php - CodeIgniter Active Record 返回 Mysql 数据类型而不仅仅是字符串

c++ - CUDA 代码在 Linux 上编译但在 Windows 上不编译(Visual Studio 2012)

asp.net - 部署到 Azure 后出现编译错误

ocaml - 如何在 esy 项目中使用 bucklescript 库和 rtop ?

dom - 从 DOM 中选择元素 - Reasonml/BuckleScript querySelector