基于约束的代数数据类型推断


11

我正在研究一种基于表达的ML族谱语言,因此自然需要类型推断> :)

现在,我正在尝试基于EOPL(Friedman和Wand)中的简单实现,将基于约束的解决方案扩展到类型推断问题,但是它们优雅地避开了代数数据类型。

到目前为止,我的工作进展顺利;如果一个表达式ea + be : Inta : Intb : Int。如果e是比赛,

match n with
  | 0 -> 1
  | n' -> n' * fac(n - 1)`, 

我可以正确地推断t(e) = t(the whole match expression)t(n) = t(0) = t(n')t(match) = t(1) = t(n' * fac(n - 1)等...

但是我不确定何时涉及代数数据类型。假设有一个类似filter的函数:

let filter pred list =
  match list with
    | Empty -> Empty
    | Cons(e, ls') when pred e -> Cons (e, filter ls')
    | Cons(_, ls') -> filter 

为了使列表类型保持多态,Cons必须为类型a * a list -> a list。因此,在建立这些限制,我显然需要查找这些类型的我的代数构造的-这个问题我现在是代数构造多种用途的“上下文相关” -我该如何表达我的约束方程的a在每个案例都需要相同吗?

我很难找到一个通用的解决方案,也无法找到很多有关此的文献。每当我找到类似的东西-基于表达式的语言和基于约束的类型推断-它们就会停止缺少代数数据类型和多态性。

任何输入,不胜感激!


@Guy我并不是说要忘恩负义,但我不是要寻找现成的解决方案-您有什么建议吗?我可以找到的大多数现有文档(例如有关ML,OCaml的INRIA论文)都比我需要的要丰富得多(并且能够理解)。
克里斯(Kris)2012年

我将从ATTAPL中的推理章节开始,我认为他们在可访问的级别上讨论了您需要的所有内容。
吉尔斯(Gilles)'所以

@Gilles我认为ATTAPL是我在书架上没有的唯一“经典” PL书:P但是,谢谢,我星期一看一看,我坐在Uni的一个地板上,大概在办公室各分发了10册: )
Kris 2012年

@Kris您是否找到解决此问题的可访问资源?我对“迷你ML”的实现恰好解决了这个问题……我想我从ATTAPL(pauillac.inria.fr/~fpottier/publis/emlti-final.pdf)中找到了相关章节,并略过了关于代数的部分数据类型,但恐怕有点麻烦了。
michiakig

@spacemanaki是的,此后我发现pdfs.semanticscholar.org/8983/…是一个很好的资源。
克里斯(Kris)

Answers:


2

请参阅:最小ML,特别是类型推断部分。

它包含F#中的示例代码,用于简单语言的完整解析器。更重要的是,类型推断部分实现了Hindley-Milner算法,这是大多数类型推断系统中都可以找到的算法。作者还提供了其他两个重要文档的链接,以帮助理解Hindley-Milner。一个是高级介绍,另一个是描述该算法在代码中的实现的论文。


单个链接通常不是答案。请详细说明在此可以找到什么以及为什么有帮助。
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.