我正在研究一种基于表达的ML族谱语言,因此自然需要类型推断> :)
现在,我正在尝试基于EOPL(Friedman和Wand)中的简单实现,将基于约束的解决方案扩展到类型推断问题,但是它们优雅地避开了代数数据类型。
到目前为止,我的工作进展顺利;如果一个表达式e
是a + b
,e : Int
,a : Int
和b : 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年
@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)