Questions tagged «type-inference»


1
可确定推断的最强大的已知类型系统是什么?
众所周知,Hindley-Milner类型推断(具有多态性的简单类型的演算)具有可确定的类型推断:您可以为任何程序重建原理类型而无需任何注释。λλ\lambda 添加哈斯克尔风格类型类似乎保留此可判定性,但进一步增加使得推理没有标注不可判定的(类型的家庭,GADTs,依赖类型,等级-N类型,系统等)ωω\omega 我想知道:最能断定推断的已知类型系统是什么?它会介于Hindley-Milner(完全可确定)和依赖类型(完全不可确定)之间。是否可以添加DT的某些方面来保持推理可判定性?已经进行了哪些研究以了解可以将其推进多远? 我意识到,没有一个最强大的系统,可能有无限的微小增量变化可以添加到HM保持推理中。但是可能已经发现了一些实用的系统候选对象。 编辑:因为没有“最强”的系统,我会接受,勾勒出一个答案显着扩展辛德雷米尔纳与可判定的推理系统。例如液体类型,等级2等。

1
为什么Hindley-Milner算法永远不会产生类似t1-> t2的类型?
我在编写实现时正在阅读有关Hindley-Milner输入算法的信息,并且看到,只要绑定了每个变量,您总会得到原子类型或参数将确定最终类型的类型,例如t1 -> t1或。(t1 -> t2) -> (t1 -> t2)其中t1和t2是类型变量。 我想不出一种方法,您将获得类似于t1 -> t2或简单的东西t1,据我所知,这意味着算法已被破坏,因为无法确定表达式的实际类型。您怎么知道只要绑定了每个变量,您就永远不会得到像“破”这样的类型? 我知道算法会产生带有变量的类型,但是一旦将参数传递给函数,这些变量就总是可以解决的,而带type的函数不会出现这种情况t1 -> t2。这就是为什么我想知道我们如何确定算法永远不会产生此类类型的原因。 (看来您可以在ML中获得这些“残缺的”类型,但我要询问的是lambda演算。)

3
通过推断类型自动向下转换
在Java中,必须显式转换以向下转换变量 public class Fruit{} // parent class public class Apple extends Fruit{} // child class public static void main(String args[]) { // An implicit upcast Fruit parent = new Apple(); // An explicit downcast to Apple Apple child = (Apple)parent; } 除了Java不执行任何类型推断的事实外,是否还有其他原因可以满足此要求? 使用新语言实现自动向下转换是否存在任何“陷阱”? 例如: Apple child = parent; // no …

1
推断优化类型
在工作中,我的任务是推断一些有关动态语言的类型信息。我将语句序列重写为嵌套let表达式,如下所示: return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } 由于我从一般类型信息开始,并试图推断出更具体的类型,因此自然的选择是精简类型。例如,条件运算符返回其真假分支类型的并集。在简单的情况下,它效果很好。 但是,在尝试推断以下类型时遇到了障碍: function …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

1
ML类型推断的指数成本的简洁示例
引起我注意的是,像OCaml这样的功能语言中类型推断的成本可能很高。该主张是有一系列表达式,使得对于每个表达式,相应类型的长度在表达式的长度上是指数的。 我设计了以下顺序。我的问题是:您是否知道一个具有更简洁表达式的序列,可以实现相同的类型? # fun a -> a;; - : 'a -> 'a = <fun> # fun b a -> b a;; - : ('a -> 'b) -> 'a -> 'b = <fun> # fun c b a -> c b (b a);; - : (('a -> 'b) -> 'b -> …

2
仅使用Hindley-Milner类型系统定义列表
我正在开发一个小型lambda演算编译器,该编译器具有运行正常的Hindley-Milner类型推断系统,并且现在还支持递归let(不在链接代码中),据我所知应该足以使Turing完成。 现在的问题是我不知道如何使它成为支持列表,或者它是否已经支持它们,我只需要找到一种编码它们的方法。我希望能够定义它们,而不必向类型系统中添加新规则。 我想到的一个列表的最简单方法x是将其作为null(或为空列表),或同时包含x和的列表对x。但是要做到这一点,我需要能够定义对和或,我相信它们是乘积和总和类型。 看来我可以这样定义对: pair = λabf.fab first = λp.p(λab.a) second = λp.p(λab.b) 因为pair将具有类型a -> (b -> ((a -> (b -> x)) -> x)),所以在传递一个int和一个后string,它会产生一个带有类型的东西(int -> (string -> x)) -> x,这将是一对intand 的表示string。这里令我困扰的是,如果那个代表一对,那为什么在逻辑上不等同于或暗示这个命题int and string呢?但是,等效于(((int and string) -> x) -> x),好像我只能将产品类型作为函数的参数一样。这个答案似乎解决了这个问题,但我不知道他使用的符号是什么意思。另外,如果这不能真正对产品类型进行编码,那么我对上面的对的定义无法做到的产品类型(考虑到我也可以用相同的方式定义n元组)做任何事情?如果不是,这是否与仅使用蕴涵就不能表达(AFAIK)连词的事实相矛盾? 另外,总和类型呢?我可以仅使用函数类型以某种方式对其进行编码吗?如果是这样,是否足以定义列表?否则,是否有其他方法可以定义列表而不必扩展我的类型系统?如果不是这样,如果我想使其尽可能简单,我需要进行哪些更改? 请记住,我是计算机程序员,但不是计算机科学家或数学家,并且在阅读数学符号方面相当不擅长。 编辑: 我不确定到目前为止实现的技术名称是什么,但是我所拥有的基本上只是上面链接的代码,这是一种约束生成算法,使用应用程序规则,抽象规则和变量先从Hinley-Milner算法开始,然后是获得主体类型的统一算法。例如,该表达式\a.a将产生type a -> a,并且该表达式\a.(a a)将引发一个发生检查错误。最重要的是,这里没有一个确切的let规则,但是一个函数似乎具有与您定义递归全局函数(如此伪代码)相同的作用: GetTypeOfGlobalFunction(term, globalScope, nameOfFunction) …

3
数据流分析,抽象解释和类型推断是否等效?
@Babou 对最近一个问题的回答使我想起,我一次看过一篇关于数据流分析的等效性(就可以推断或证明的事实以及运行推理算法的时间复杂性)的论文,抽象解释和类型推断。 在某些子情况下(例如在前向上下文相关的过程间数据流分析与抽象解释之间),对我来说等效性是相对明显的,但对于其他比较而言,这个问题似乎更加微妙。例如,我不知道如何使用Hindley-Milner类型推断来证明可以通过对流量敏感的数据流分析来证明的某些属性。 有哪些开创性的参考文献讨论数据流分析,抽象解释和类型推断之间的等效性(或差异)?

2
类型推断+重载
我正在寻找一种针对我正在开发的语言的类型推断算法,但找不到适合我需求的语言,因为它们通常是: Haskellà具有多态性,但没有临时重载 àla C ++(自动),其中有特定的重载,但函数是单态的 特别是我的类型系统是(简化)(我使用的是Haskellish语法,但这与语言无关): data Type = Int | Double | Matrix Type | Function Type Type 而且我有一个运算符*,其中有很多重载: Int -> Int -> Int (Function Int Int) -> Int -> Int Int -> (Function Int Int) -> (Function Int Int) (Function Int Int) -> (Function Int Int) -> (Function …
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.