失眠吃什么药见效快| 才高八斗是什么意思| 有加有减先算什么| 什么的气味| 查脂肪肝做什么检查| 液体变固体叫什么| 肖像是什么意思| 0到3个月的婴儿惊吓吃什么药| hn是什么意思| 越南有什么特产| 轻度脂肪肝有什么症状| 韬光养晦下一句是什么| 唐筛21三体临界风险是什么意思| 痔疮用什么药好| 左侧脖子疼是什么原因| 郭靖属什么生肖| 爱新觉罗改成什么姓了| 三国演义是什么朝代| 腮腺炎的症状是什么| 四季不安痣是什么意思| 女人喝劲酒有什么好处| 孕妇为什么不能吃桃子| 打虫药什么时候吃合适| 口渴喝什么最解渴| da医学上是什么意思| 海马是什么动物| 梦见恐龙是什么意思| 平反是什么意思| 大黄是什么药材| 手脚发胀是什么前兆| 高会是什么意思| 九月是什么星座的| 孩子感冒咳嗽吃什么药| cns医学上是什么意思| 九品芝麻官是什么级别| 农历7月20日是什么星座| 官杀是什么| 农历六月初六是什么星座| 透亮是什么意思| 高尿酸血症吃什么药| 肛门跳动是什么原因| 豆蔻年华是什么意思| 右眼睛跳是什么意思| 追光是什么意思| shark是什么意思| 火象是什么意思| 1.19是什么星座| 检查hpv需要注意什么提前注意什么| 蜻蜓点水的目的是什么| 坐月子什么不能吃| gm是什么单位| 曲安奈德是什么药| 魔芋是什么东西| 吃什么掉秤快| 手指盖空了是什么原因| 应景是什么意思| sk是什么牌子| 德国是什么人种| 窈窕淑女君子好逑是什么意思| 身上起红斑是什么原因| 高同型半胱氨酸血症是什么病| 腿脚酸软无力是什么原因| 土鳖虫吃什么| ug是什么单位| 梦见狐狸是什么意思| 新生儿痤疮是什么引起的| 长脸适合什么发型| 吃什么补黄体酮| 滑膜炎是什么| 劼字取名的寓意是什么| 笔芯是什么意思| 什么水果可以解酒| 脑梗吃什么药效果好| 闻所未闻是什么意思| 驴打滚是什么意思| 心寒是什么意思| 什么是扬州瘦马| 猫的舌头为什么有刺| 淼读什么字| 02年的属什么| 女单读什么| 路政属于什么单位| 黑枸杞泡茶是什么颜色| 王字旁加己念什么| 弱水三千什么意思| 马是什么牌子的车| 什么牌子的耳机音质效果最好| 中国黄金为什么比其它金店便宜| 下面外面瘙痒用什么药| 长命百岁的动物是什么| 恶寒什么意思| 吃什么促进卵泡发育| b族维生素什么时候吃最好| 知了为什么一直叫| 肠溶片和缓释片有什么区别| 眼睛白色部分叫什么| 附睾炎吃什么药最有效| 天天睡不着觉什么原因| 为什么眉毛会白| 红加绿是什么颜色| 嗳腐吞酸是什么意思| 什么的高楼| 活检是什么意思| 吃惊的近义词是什么| 小雪是什么意思| yair是什么牌子的空调| 孟母三迁的故事告诉我们什么道理| 字帖是什么| 为什么星星会眨眼睛| 螃蟹代表什么生肖| 骶髂关节炎吃什么药| 冰片是什么| 合肥有什么好玩的地方| 阴虚湿热吃什么中成药| 人的血压一天中什么时候最高| 冬瓜什么时候种植最好| 胃病烧心吃什么药好| 女人喝茶有什么好处| 2008年属鼠是什么命| 什么是肺结核| 不加一笔是什么字| 洗手做羹汤是什么意思| 突如其来什么意思| 什么是情感障碍| 九月二十三是什么星座| 糟卤对身体有什么危害| 房子什么朝向好| 鸡眼用什么药好| 系统性红斑狼疮是什么病| 湿气是什么原因造成的| 烟酸是什么| 脚底烧热是什么原因| 电焊打眼睛用什么眼药水| 忤是什么意思| 紧锣密鼓是什么意思| 男人做噩梦是什么预兆| cto是什么职位| 自言自语说话是什么病| 四维彩超和大排畸有什么区别| 九七年属什么生肖| bdp是什么意思| 白俄罗斯和俄罗斯有什么区别| 10.1什么星座| 橘红是什么| 畏手畏脚是什么意思| 原始心管搏动是什么意思| 海带和什么菜搭配好吃| 刻舟求剑的求是什么意思| 肛裂用什么药膏| 后背疼痛挂什么科| 开心果树长什么样| c13阳性是什么意思| 血糖高是什么病| 出家人不打诳语是什么意思| 经常吐口水是什么原因| 这是什么| 八月六号是什么星座| 全光谱是什么意思| 纸可以折什么| 医是什么结构的字| 1月26是什么星座| 獠牙是什么意思| 减肥应该吃什么| 大便干结是什么原因| 乱点鸳鸯谱什么意思| 斗米恩升米仇什么意思| 主理人什么意思| 胰腺上长瘤意味着什么| 赢字五行属什么| 74年属什么| 着数是什么意思| 青蛇是什么蛇| 梦见自己大笑是什么意思| 天然气是什么气体| 孕早期失眠是什么原因| 女为读什么| 流鼻血吃什么| 右眼睛跳是什么意思| 满满的回忆什么意思| ab是什么血型| 高钙血症是什么意思| 天上的月亮是什么生肖| 多吃洋葱有什么好处| 吃什么油最健康排行榜| 画饼充饥是什么意思| 拔牙能吃什么| 什么是处方药| cmv是什么病毒| 多囊卵巢综合症是什么原因造成的| 亚蒂息肉是什么意思| 胎儿宫内缺氧孕妇有什么症状| 宫腔积液排出什么颜色| 九霄云外是什么生肖| 脐下三寸是什么地方| 八字指的是什么| 双重所有格是什么意思| 补肾壮阳吃什么效果好| 气血不足什么原因引起的| 骨膜炎用什么药| 五音是什么| 爱是什么东西| 为什么叫夺命大乌苏| 蛇盘疮长什么样| 脚背疼是什么原因| 淋巴细胞绝对值偏高是什么意思| 2018是什么生肖| 渐冻症是什么| 成吉思汗姓什么| 广州地铁什么时候停运| 男孩学什么技术最好| RH什么意思| 小孩肠系膜淋巴结炎吃什么药| 7月7日是什么日子| g18k金是什么意思| 蛋白尿是什么意思| 条索灶是什么意思| 开封有什么好玩的地方| 湉字五行属什么| 胆囊结石吃什么药| 鬼佬是什么意思| 肝脏的作用是什么| 心肌炎吃什么药效果好| 想吃咸的是身体缺什么| 胰是什么器官| 牛蛙不能和什么一起吃| 丁香茶有什么作用和功效| 痛风可以喝什么饮料| 川崎病是什么症状| 吃什么补头发| s999是什么意思| 忠心不二是什么生肖| 仲夏什么意思| 什么情况啊这是| 喝什么饮料解酒最快| 活字印刷术是什么时候发明的| 做梦梦见猪是什么意思| 望洋兴叹什么意思| 苹果越狱是什么意思啊| 贝贝什么意思| 冰妹什么意思| 脚脱皮是什么原因| 阴道口痒用什么药| 经期头痛吃什么药| 月经后期是什么意思| 乳酸高是什么原因| 脑梗有什么前兆| 甲钴胺有什么副作用| 母胎solo是什么意思| 什么的鼓励| 电荷是什么意思| 梦见好多人是什么意思| 测测你天生靠什么吃饭| 负罪感是什么意思| 肠子粘连有什么办法解决| 双手麻是什么原因| 狮子座和什么星座不合| 内退是什么意思| 糙米饭是什么米| MR医学上是什么意思| 头痒用什么东西洗头最好| 老虎下山下一句是什么| 决断是什么意思| 指甲长得快说明什么| 红花油和活络油有什么区别| 百度

西藏那曲地区尼玛县城至文布乡至文部南村公路改...

百度 赵国的成年男丁几乎在长平被白起砍光,也没见赵国人对秦国抱有如楚国般不死不休的仇恨,这是为何?  因为作死小能手楚怀王又开始作了。

Type inference, sometimes called type reconstruction,[1]:?320? refers to the automatic detection of the type of an expression in a formal language. These include programming languages and mathematical type systems, but also natural languages in some branches of computer science and linguistics.

Nontechnical explanation

edit

In a typed language, a term's type determines the ways it can and cannot be used in that language. For example, consider the English language and terms that could fill in the blank in the phrase "sing _." The term "a song" is of singable type, so it could be placed in the blank to form a meaningful phrase: "sing a song." On the other hand, the term "a friend" does not have the singable type, so "sing a friend" is nonsense. At best it might be metaphor; bending type rules is a feature of poetic language.

A term's type can also affect the interpretation of operations involving that term. For instance, "a song" is of composable type, so we interpret it as the thing created in the phrase "write a song". On the other hand, "a friend" is of recipient type, so we interpret it as the addressee in the phrase "write a friend". In normal language, we would be surprised if "write a song" meant addressing a letter to a song or "write a friend" meant drafting a friend on paper.

Terms with different types can even refer to materially the same thing. For example, we would interpret "to hang up the clothes line" as putting it into use, but "to hang up the leash" as putting it away, even though, in context, both "clothes line" and "leash" might refer the same rope, just at different times.

Typings are often used to prevent an object from being considered too generally. For instance, if the type system treats all numbers as the same, then a programmer who accidentally writes code where 4 is supposed to mean "4 seconds" but is interpreted as "4 meters" would have no warning of their mistake until it caused problems at runtime. By incorporating units into the type system, these mistakes can be detected much earlier. As another example, Russell's paradox arises when anything can be a set element and any predicate can define a set, but more careful typing gives several ways to resolve the paradox. In fact, Russell's paradox sparked early versions of type theory.

There are several ways that a term can get its type:

  • The type might be provided from somewhere outside the passage. For instance, if a speaker refers to "a song" in English, they generally do not have to tell the listener that "a song" is singable and composable; that information is part of their shared background knowledge.
  • The type can be declared explicitly. For example, a programmer might write a statement like delay: seconds := 4 in their code, where the colon is the conventional mathematical symbol to mark a term with its type. That is, this statement is not only setting delay to the value 4, but the delay: seconds part also indicates that delay's type is an amount of time in seconds.
  • The type can be inferred from context. For example, in the phrase "I bought it for a song", we can observe that trying to give the term "a song" types like "singable" and "composable" would lead to nonsense, whereas the type "amount of currency" works out. Therefore, without having to be told, we conclude that "song" here must mean "little to nothing", as in the English idiom "for a song", not "a piece of music, usually with lyrics".

Especially in programming languages, there may not be much shared background knowledge available to the computer. In manifestly typed languages, this means that most types have to be declared explicitly. Type inference aims to alleviate this burden, freeing the author from declaring types that the computer should be able to deduce from context.

Type-checking vs. type-inference

edit

In a typing, an expression E is opposed to a type T, formally written as E : T. Usually a typing only makes sense within some context, which is omitted here.

In this setting, the following questions are of particular interest:

  1. E : T? In this case, both an expression E and a type T are given. Now, is E really a T? This scenario is known as type-checking.
  2. E : _? Here, only the expression is known. If there is a way to derive a type for E, then we have accomplished type inference.
  3. _ : T? The other way round. Given only a type, is there any expression for it or does the type have no values? Is there any example of a T? This is known as type inhabitation.

For the simply typed lambda calculus, all three questions are decidable. The situation is not as comfortable when more expressive types are allowed.

Types in programming languages

edit

Types are a feature present in some strongly statically typed languages. It is often characteristic of functional programming languages in general. Some languages that include type inference include C23,[2] C++11,[3] C# (starting with version 3.0), Chapel, Clean, Crystal, D, Dart,[4] F#,[5] FreeBASIC, Go, Haskell, Java (starting with version 10), Julia,[6] Kotlin,[7] ML, Nim, OCaml, Opa, Q#, RPython, Rust,[8] Scala,[9] Swift,[10] TypeScript,[11] Vala,[12] Zig, and Visual Basic[13] (starting with version 9.0). The majority of them use a simple form of type inference; the Hindley–Milner type system can provide more complete type inference. The ability to infer types automatically makes many programming tasks easier, leaving the programmer free to omit type annotations while still permitting type checking.

In some programming languages, all values have a data type explicitly declared at compile time, limiting the values a particular expression can take on at run-time. Increasingly, just-in-time compilation blurs the distinction between run time and compile time. However, historically, if the type of a value is known only at run-time, these languages are dynamically typed. In other languages, the type of an expression is known only at compile time; these languages are statically typed. In most statically typed languages, the input and output types of functions and local variables ordinarily must be explicitly provided by type annotations. For example, in ANSI C:

int add_one(int x) {
    int result; /* declare integer result */

    result = x + 1;
    return result;
}

The signature of this function definition, int add_one(int x), declares that add_one is a function that takes one argument, an integer, and returns an integer. int result; declares that the local variable result is an integer. In a hypothetical language supporting type inference, the code might be written like this instead:

add_one(x) {
    var result;  /* inferred-type variable result */
    var result2; /* inferred-type variable result #2 */

    result = x + 1;
    result2 = x + 1.0;  /* this line won't work (in the proposed language) */
    return result;
}

This is identical to how code is written in the language Dart, except that it is subject to some added constraints as described below. It would be possible to infer the types of all the variables at compile time. In the example above, the compiler would infer that result and x have type integer since the constant 1 is type integer, and hence that add_one is a function int -> int. The variable result2 isn't used in a legal manner, so it wouldn't have a type.

In the imaginary language in which the last example is written, the compiler would assume that, in the absence of information to the contrary, + takes two integers and returns one integer. (This is how it works in, for example, OCaml.) From this, the type inferencer can infer that the type of x + 1 is an integer, which means result is an integer and thus the return value of add_one is an integer. Similarly, since + requires both of its arguments be of the same type, x must be an integer, and thus, add_one accepts one integer as an argument.

However, in the subsequent line, result2 is calculated by adding a decimal 1.0 with floating-point arithmetic, causing a conflict in the use of x for both integer and floating-point expressions. The correct type-inference algorithm for such a situation has been known since 1958 and has been known to be correct since 1982. It revisits the prior inferences and uses the most general type from the outset: in this case floating-point. This can however have detrimental implications, for instance using a floating-point from the outset can introduce precision issues that would have not been there with an integer type.

Frequently, however, degenerate type-inference algorithms are used that cannot backtrack and instead generate an error message in such a situation. This behavior may be preferable as type inference may not always be neutral algorithmically, as illustrated by the prior floating-point precision issue.

An algorithm of intermediate generality implicitly declares result2 as a floating-point variable, and the addition implicitly converts x to a floating point. This can be correct if the calling contexts never supply a floating point argument. Such a situation shows the difference between type inference, which does not involve type conversion, and implicit type conversion, which forces data to a different data type, often without restrictions.

Finally, a significant downside of complex type-inference algorithm is that the resulting type inference resolution is not going to be obvious to humans (notably because of the backtracking), which can be detrimental as code is primarily intended to be comprehensible to humans.

The recent emergence of just-in-time compilation allows for hybrid approaches where the type of arguments supplied by the various calling context is known at compile time, and can generate a large number of compiled versions of the same function. Each compiled version can then be optimized for a different set of types. For instance, JIT compilation allows there to be at least two compiled versions of add_one:

A version that accepts an integer input and uses implicit type conversion.
A version that accepts a floating-point number as input and uses floating point instructions throughout.

Technical description

edit

Type inference is the ability to automatically deduce, either partially or fully, the type of an expression at compile time. The compiler is often able to infer the type of a variable or the type signature of a function, without explicit type annotations having been given. In many cases, it is possible to omit type annotations from a program completely if the type inference system is robust enough, or the program or language is simple enough.

To obtain the information required to infer the type of an expression, the compiler either gathers this information as an aggregate and subsequent reduction of the type annotations given for its subexpressions, or through an implicit understanding of the type of various atomic values (e.g. true : Bool; 42 : Integer; 3.14159 : Real; etc.). It is through recognition of the eventual reduction of expressions to implicitly typed atomic values that the compiler for a type inferring language is able to compile a program completely without type annotations.

In complex forms of higher-order programming and polymorphism, it is not always possible for the compiler to infer as much, and type annotations are occasionally necessary for disambiguation. For instance, type inference with polymorphic recursion is known to be undecidable. Furthermore, explicit type annotations can be used to optimize code by forcing the compiler to use a more specific (faster/smaller) type than it had inferred.[14]

Some methods for type inference are based on constraint satisfaction[15] or satisfiability modulo theories.[16]

High-Level Example

edit

As an example, the Haskell function map applies a function to each element of a list, and may be defined as:

map f [] = []
map f (first:rest) = f first : map f rest

(Recall that : in Haskell denotes cons, structuring a head element and a list tail into a bigger list or destructuring a nonempty list into its head element and its tail. It does not denote "of type" as in mathematics and elsewhere in this article; in Haskell that "of type" operator is written :: instead.)

Type inference on the map function proceeds as follows. map is a function of two arguments, so its type is constrained to be of the form a -> b -> c. In Haskell, the patterns [] and (first:rest) always match lists, so the second argument must be a list type: b = [d] for some type d. Its first argument f is applied to the argument first, which must have type d, corresponding with the type in the list argument, so f :: d -> e (:: means "is of type") for some type e. The return value of map f, finally, is a list of whatever f produces, so [e].

Putting the parts together leads to map :: (d -> e) -> [d] -> [e]. Nothing is special about the type variables, so it can be relabeled as

map :: (a -> b) -> [a] -> [b]

It turns out that this is also the most general type, since no further constraints apply. As the inferred type of map is parametrically polymorphic, the type of the arguments and results of f are not inferred, but left as type variables, and so map can be applied to functions and lists of various types, as long as the actual types match in each invocation.

Detailed Example

edit

The algorithms used by programs like compilers are equivalent to the informally structured reasoning above, but a bit more verbose and methodical. The exact details depend on the inference algorithm chosen (see the following section for the best-known algorithm), but the example below gives the general idea. We again begin with the definition of map:

map f [] = []
map f (first:rest) = f first : map f rest

(Again, remember that the : here is the Haskell list constructor, not the "of type" operator, which Haskell instead spells ::.)

First, we make fresh type variables for each individual term:

  • α shall denote the type of map that we want to infer.
  • β shall denote the type of f in the first equation.
  • [γ] shall denote the type of [] on the left side of the first equation.
  • [δ] shall denote the type of [] on the right side of the first equation.
  • ε shall denote the type of f in the second equation.
  • ζ -> [ζ] -> [ζ] shall denote the type of : on the left side of the first equation. (This pattern is known from its definition.)
  • η shall denote the type of first.
  • θ shall denote the type of rest.
  • ι -> [ι] -> [ι] shall denote the type of : on the right side of the first equation.

Then we make fresh type variables for subexpressions built from these terms, constraining the type of the function being invoked accordingly:

  • κ shall denote the type of map f []. We conclude that α ~ β -> [γ] -> κ where the "similar" symbol ~ means "unifies with"; we are saying that α, the type of map, must be compatible with the type of a function taking a β and a list of γs and returning a κ.
  • λ shall denote the type of (first:rest). We conclude that ζ -> [ζ] -> [ζ] ~ η -> θ -> λ.
  • μ shall denote the type of map f (first:rest). We conclude that α ~ ε -> λ -> μ.
  • ν shall denote the type of f first. We conclude that ε ~ η -> ν.
  • ξ shall denote the type of map f rest. We conclude that α ~ ε -> θ -> ξ.
  • ο shall denote the type of f first : map f rest. We conclude that ι -> [ι] -> [ι] ~ ν -> ξ -> ο.

We also constrain the left and right sides of each equation to unify with each other: κ ~ [δ] and μ ~ ο. Altogether the system of unifications to solve is:

α ~ β -> [γ] -> κ
ζ -> [ζ] -> [ζ] ~ η -> θ -> λ
α ~ ε -> λ -> μ
ε ~ η -> ν
α ~ ε -> θ -> ξ
ι -> [ι] -> [ι] ~ ν -> ξ -> ο
κ ~ [δ]
μ ~ ο

Then we substitute until no further variables can be eliminated. The exact order is immaterial; if the code type-checks, any order will lead to the same final form. Let us begin by substituting ο for μ and [δ] for κ:

α ~ β -> [γ] -> [δ]
ζ -> [ζ] -> [ζ] ~ η -> θ -> λ
α ~ ε -> λ -> ο
ε ~ η -> ν
α ~ ε -> θ -> ξ
ι -> [ι] -> [ι] ~ ν -> ξ -> ο

Substituting ζ for η, [ζ] for θ and λ, ι for ν, and [ι] for ξ and ο, all possible because a type constructor like · -> · is invertible in its arguments:

α ~ β -> [γ] -> [δ]
α ~ ε -> [ζ] -> [ι]
ε ~ ζ -> ι

Substituting ζ -> ι for ε and β -> [γ] -> [δ] for α, keeping the second constraint around so that we can recover α at the end:

α ~ (ζ -> ι) -> [ζ] -> [ι]
β -> [γ] -> [δ] ~ (ζ -> ι) -> [ζ] -> [ι]

And, finally, substituting (ζ -> ι) for β as well as ζ for γ and ι for δ because a type constructor like [·] is invertible eliminates all the variables specific to the second constraint:

α ~ (ζ -> ι) -> [ζ] -> [ι]

No more substitutions are possible, and relabeling gives us map :: (a -> b) -> [a] -> [b], the same as we found without going into these details.

Hindley–Milner type inference algorithm

edit

The algorithm first used to perform type inference is now informally termed the Hindley–Milner algorithm, although the algorithm should properly be attributed to Damas and Milner.[17] It is also traditionally called type reconstruction.[1]:?320? If a term is well-typed in accordance with Hindley–Milner typing rules, then the rules generate a principal typing for the term. The process of discovering this principal typing is the process of "reconstruction".

The origin of this algorithm is the type inference algorithm for the simply typed lambda calculus that was devised by Haskell Curry and Robert Feys in 1958.[citation needed] In 1969 J. Roger Hindley extended this work and proved that their algorithm always inferred the most general type. In 1978 Robin Milner,[18] independently of Hindley's work, provided an equivalent algorithm, Algorithm W. In 1982 Luis Damas[17] finally proved that Milner's algorithm is complete and extended it to support systems with polymorphic references.

Side-effects of using the most general type

edit

By design, type inference will infer the most general type appropriate. However, many languages, especially older programming languages, have slightly unsound type systems, where using a more general types may not always be algorithmically neutral. Typical cases include:

  • Floating-point types being considered as generalizations of integer types. Actually, floating-point arithmetic has different precision and wrapping issues than integers do.
  • Variant/dynamic types being considered as generalizations of other types in cases where this affects the selection of operator overloads. For example, the + operator may add integers but may concatenate variants as strings, even if those variants hold integers.

Type inference for natural languages

edit

Type inference algorithms have been used to analyze natural languages as well as programming languages.[19][20][21] Type inference algorithms are also used in some grammar induction[22][23] and constraint-based grammar systems for natural languages.[24]

References

edit
  1. ^ a b Benjamin C. Pierce (2002). Types and Programming Languages. MIT Press. ISBN 978-0-262-16209-8.
  2. ^ "WG14-N3007 : Type inference for object definitions". open-std.org. 2025-08-07. Archived from the original on December 24, 2022.
  3. ^ "Placeholder type specifiers (since C++11) - cppreference.com". en.cppreference.com. Retrieved 2025-08-07.
  4. ^ "The Dart type system". dart.dev. Retrieved 2025-08-07.
  5. ^ cartermp. "Type Inference - F#". docs.microsoft.com. Retrieved 2025-08-07.
  6. ^ "Inference · The Julia Language". docs.julialang.org. Retrieved 2025-08-07.
  7. ^ "Kotlin language specification". kotlinlang.org. Retrieved 2025-08-07.
  8. ^ "Statements - The Rust Reference". doc.rust-lang.org. Retrieved 2025-08-07.
  9. ^ "Type Inference". Scala Documentation. Retrieved 2025-08-07.
  10. ^ "The Basics — The Swift Programming Language (Swift 5.5)". docs.swift.org. Retrieved 2025-08-07.
  11. ^ "Documentation - Type Inference". www.typescriptlang.org. Retrieved 2025-08-07.
  12. ^ "Projects/Vala/Tutorial - GNOME Wiki!". wiki.gnome.org. Retrieved 2025-08-07.
  13. ^ KathleenDollard. "Local Type Inference - Visual Basic". docs.microsoft.com. Retrieved 2025-08-07.
  14. ^ Bryan O'Sullivan; Don Stewart; John Goerzen (2008). "Chapter 25. Profiling and optimization". Real World Haskell. O'Reilly.
  15. ^ Talpin, Jean-Pierre, and Pierre Jouvelot. "Polymorphic type, region and effect inference." Journal of functional programming 2.3 (1992): 245-271.
  16. ^ Hassan, Mostafa; Urban, Caterina; Eilers, Marco; Müller, Peter (2018). "MaxSMT-Based Type Inference for Python 3". Computer Aided Verification. Lecture Notes in Computer Science. Vol. 10982. pp. 12–19. doi:10.1007/978-3-319-96142-2_2. ISBN 978-3-319-96141-5.
  17. ^ a b Damas, Luis; Milner, Robin (1982), "Principal type-schemes for functional programs", POPL '82: Proceedings of the 9th ACM SIGPLAN-SIGACT symposium on principles of programming languages (PDF), ACM, pp. 207–212
  18. ^ Milner, Robin (1978), "A Theory of Type Polymorphism in Programming", Journal of Computer and System Sciences, 17 (3): 348–375, doi:10.1016/0022-0000(78)90014-4, hdl:20.500.11820/d16745d7-f113-44f0-a7a3-687c2b709f66
  19. ^ Center, Artificia? Intelligence. Parsing and type inference for natural and computer languages Archived 2025-08-07 at the Wayback Machine. Diss. Stanford University, 1989.
  20. ^ Emele, Martin C., and Rémi Zajac. "Typed unification grammars Archived 2025-08-07 at the Wayback Machine." Proceedings of the 13th conference on Computational linguistics-Volume 3. Association for Computational Linguistics, 1990.
  21. ^ Pareschi, Remo. "Type-driven natural language analysis." (1988).
  22. ^ Fisher, Kathleen, et al. "Fisher, Kathleen, et al. "From dirt to shovels: fully automatic tool generation from ad hoc data." ACM SIGPLAN Notices. Vol. 43. No. 1. ACM, 2008." ACM SIGPLAN Notices. Vol. 43. No. 1. ACM, 2008.
  23. ^ Lappin, Shalom; Shieber, Stuart M. (2007). "Machine learning theory and practice as a source of insight into universal grammar" (PDF). Journal of Linguistics. 43 (2): 393–427. doi:10.1017/s0022226707004628. S2CID 215762538.
  24. ^ Stuart M. Shieber (1992). Constraint-based Grammar Formalisms: Parsing and Type Inference for Natural and Computer Languages. MIT Press. ISBN 978-0-262-19324-5.
edit
肾的作用和功能是什么 为什么耳朵会痛 肿瘤标志物五项检测是什么 毛囊炎是什么症状图片 肠胃消化不好吃什么药
灰色配什么颜色 多汗症是什么原因引起的 准妈妈是什么意思 烤乳猪用的是什么猪 氨水对人体有什么危害
胆囊炎吃什么消炎药 多囊什么意思 长史相当于现在什么官 抗病毒什么药效果好 11点半是什么时辰
掰手指头响有什么危害 乙肝携带者是什么意思 螺内酯片治什么病 腺癌是什么癌 载脂蛋白b偏低是什么意思
acc是什么意思hcv8jop1ns2r.cn 小孩抽多动症吃什么药最好hcv9jop2ns8r.cn 牛柳是什么肉hcv9jop6ns2r.cn 水宝宝是什么hcv8jop1ns8r.cn b2c模式是什么意思hcv7jop6ns3r.cn
何去何从什么意思hcv9jop4ns0r.cn 布洛芬的副作用是什么hcv8jop1ns5r.cn 甲亢病吃什么药效果好cj623037.com 标题是什么意思hcv8jop5ns8r.cn 五步蛇长什么样hcv9jop2ns9r.cn
怒发冲冠是什么意思hcv8jop3ns6r.cn 红花有什么功效hcv7jop6ns7r.cn 万箭穿心是什么意思hcv9jop7ns5r.cn 血压高吃什么hcv9jop1ns6r.cn 天天喝绿茶有什么好处和坏处hcv9jop1ns5r.cn
益母草能治什么病hcv8jop3ns8r.cn 什么叫浪漫huizhijixie.com 宫内膜回声欠均匀是什么意思hcv9jop4ns3r.cn 心凉是什么意思qingzhougame.com 耳朵背后有痣代表什么hcv8jop4ns8r.cn
百度