当前位置: 首页 > 知识库问答 >
问题:

编码为模块递归的多态递归类型推断

戚建德
2023-03-14

标准 ML 没有多态递归。在模块语言中添加递归允许我们使用内函子的固定点将多态递归恢复为一种特殊情况。例如:

signature SEQ =
sig
  type 'a seq

  (* operations on sequences *)
end

functor BootstrapSeq (S : SEQ) =
struct
  datatype 'a seq
    = Nil
    | Zero of ('a * 'a) S.seq
    | One of 'a * ('a * 'a) S.seq

  (* operations on sequences *)
end

structure rec Seq = BootstrapSeq (Seq)

众所周知,多态递归使得类型推理不可判定。然而,函子定义已经包含部分类型信息,即其参数的签名。这些信息足以使类型推理再次可判定吗?

共有1个答案

罗晨
2023-03-14

是的,因为签名提供了多态类型的“前向声明”,因此不必以递归方式推断。此外,您不需要函子,您可以直接编写递归结构绑定。但这需要签名注释,因此是相同的。

 类似资料:
  • 下面是我正在尝试的代码: 我得到的错误是在我的字符串末尾多了一个字符。第一个示例将给出“chocchochcc”和第二个“chochcc”,等等。我只是想知道,从概念上来说,我做错了什么,以及如何修复它。

  • 查看我在某处(这里是游乐场)找到的这个Typescript4.2片段: 我的头不能绕着它。TS如何处理这件事?它怎么不卡在无限递归里?具体地说,对于和的情况,悬停在变量上显示TS将类型解析为和。这是怎么回事?

  • (Scala 2.11.8) 我有一个类似GenTableLike的特征,具有复杂的自递归类型签名,它定义了连接兼容表实现的方法。我还有一个层次结构 下面是一个稍微简化的片段,其中问题仍然存在: 我是不是做错了什么? 自类型和转置类型用于定义函数返回类型。我还有一个IndexedTable实现定义如下,所以我不能返工自类型以接受3个参数

  • 我正在制作一种强类型的玩具函数式编程语言。它使用Hindley Milner算法作为类型推断算法。 在实现该算法时,我有一个问题,即如何推断相互递归函数的类型。 和是相互递归的函数。现在,当类型检查器推断函数的类型时,它也应该能够推断函数的类型,因为它是一个子表达式。 但是,在那一刻,函数还没有定义。因此,显然,类型检查器甚至不知道函数的存在,以及函数的类型。 真实世界的编译器/Inteprete

  • 我对函数式编程很陌生,尤其是下面使用的Scheme。我正在尝试使以下函数是递归的,尾递归的。基本上,该函数的作用是对两个字符串的对齐方式进行评分。当给定两个字符串作为输入时,它会比较每个“列”字符,并根据在称为 scorer 的函数中实现的评分方案(由下面的代码中的函数调用)来累积该对齐的分数。 我有一个想法,用一个帮助函数来累积分数,但我不太确定如何去做,因此我该如何让下面的函数尾递归呢?

  • 我试图了解如何将各种递归函数转换为尾递归。我已经查看了许多将斐波那契和阶乘转换为尾递归的示例,并理解了这些示例,但很难跳到具有某种不同结构的问题。一个例子是: 如何将其转换为尾部递归实现? 我已经看过类似的问题,例如:将正常递归转换为尾部递归,但这些似乎并没有转化为这个问题。