问题 在C ++中实现的类型推断


是否有C ++中的实现 达马斯-辛德米尔纳 样式类型推断,最好使用现代C ++技术?


1957
2018-01-08 02:10


起源

呃......什么是Damas-Hindley-Milner风格的类型推断?任何链接都会很好。另请注意,C ++ 11增加了 auto 用于类型推断,和 template当用作函数参数时,s是本质推理类型。 - Xeo
你能详细说明“Damas-Hindley-Milner风格类型推断”是什么吗?我不想谷歌搜索它。 - Benjamin Lindley
@BenjaminLindley:我想这是一种情况,如果你不得不查一查,你可能无法得到答案,或者...... - Kerrek SB
我认为问题不是 {implementation of {type inference in C++}}, 反而, {implementation in C++ of {type inference}}。 @Keveman:检查关于SO的其他问题(我添加了正确的标签),也许它们有一些帮助......也许C ++编译器的源代码可以是教育性的,因为模板是一种函数式编程语言。 - Kerrek SB
根据Kerrek的建议更改了描述。 - keveman


答案:


这里的 我在C ++ 11中实现了Hindley-Milner类推理,基于 Robert Smallshire的Python代码斯科拉代码由安德鲁福雷斯特,尼基塔·鲍里索夫的Perl代码和 论Cardelli的“基本多态Typechecking”

它大量使用 boost::variant 和 boost::apply_visitor


12
2018-03-02 08:22



你也可以找到 boost::disjoint_sets 对联合查找操作很有用。 - max


我怀疑你不会有太多运气;编写这些东西的功能人员通常不会在C ++中这样做!您可以使用的大多数编译器都用于编译自己(例如,用于OCaml或GHC)。

所以,如果有人确实将欣德利 - 米尔纳作为一个玩具项目,它可能不在网上;如果它是编译器的一部分,那么它不太可能是在C ++中。

想到的可能事情:

  • 拥抱 对于Haskell来说是C;那里会有一些C源可以做你想做的事情,Haskell是一个很熟悉的糖。不是你想要的C ++。
  • 我对F#一无所知,但我认为这是HM,如果有人用C ++编写了一个带有现代技术的胖函数编译器,它可能就是MS。显然是封闭的来源。

1
2018-01-10 14:03





我们这里有一个类型推理引擎(https://github.com/ltcmelo/psychec)。我们的方法是在Pottier和Remy的HM(X)算法之后实现的,具有适当的约束生成和类型推断的单独阶段。约束生成在C ++中实现,但类型解析在Haskell中实现(抱歉!)。该算法推断出C程序的类型,以重建部分可用的代码。该工具可在线获取: http://cuda.dcc.ufmg.br/psyche-c/。您输入C程序的一部分,并生成足以编译它的类型声明。

问候,

费尔南多


0
2017-11-30 16:33