司令是什么军衔| 鹌鹑是什么| 宫颈糜烂用什么药比较好| 为什么会长智齿| 牛逼是什么意思| 女人的逼什么样| 61岁属什么| 脚上有水泡是什么原因| 皮肤过敏吃什么| 什么是赤道| 参保是什么意思| 今天属什么生肖日历| 肾结石为什么会疼| 糖尿病的根源是什么| 疏朗是什么意思| 刑事拘留意味着什么| 尿酸高尿液是什么颜色| sport什么品牌| 变色龙指什么样的人| 女性外阴痒用什么药| 身份是什么意思| 什么是性激素| 10月底是什么星座| 户籍地是什么| 武警是干什么的| 奥利司他排油是什么油| 信徒什么意思| 荨麻疹什么东西不能吃| 外感是什么意思| 双肺多发结节是什么意思| 社日是什么意思| 离婚需要什么资料| 九月是什么星座的| oct什么意思| 早上九点半是什么时辰| 胆囊炎吃什么| 放河灯是什么节日| hw是什么牌子| b2驾照能开什么车| 积分落户是什么意思| 梅核气是什么病| 肺结核是什么原因引起的| 上火吃什么药| 黑枸杞和什么一起泡水喝比较好| 流清水鼻涕是什么感冒| cu是什么意思| 掉头发缺什么维生素| 米娜桑什么意思| 湿疹长什么样图片| 副高相当于什么级别| 复刻是什么意思| 羊后马前对是什么生肖| 樱桃不能和什么一起吃| 闭角型青光眼是什么意思| 采耳是什么意思| 蚊子有什么用| 烊化是什么意思| 淀粉吃多了有什么危害| 什么蔬菜补铁效果最好| 做梦和别人吵架意味着什么| 肾不纳气用什么中成药| 造化弄人是什么意思| Lady什么意思| 膝盖疼做什么检查最好| 植物神经功能紊乱吃什么药| 养成系是什么意思| 国家专项是什么意思| 氨基比林是什么药| 降压灵又叫什么| 感统失调挂什么科| 手麻是什么原因引起的| 吃什么食物最补血| 什么鸟一生只有一个伴侣| 什么情况下吃丹参滴丸| 外阴干裂用什么药| 什么叫放疗| 清宫后需要注意什么| 什么叫暧昧| 卧推练什么肌肉| 消化内科是看什么病的| 窈窕是什么意思| lava是什么意思| 出国用什么翻译软件好| 目敢念什么| 区长什么级别| 眼底出血是什么原因造成的| 老玻璃是什么意思| 什么叫hp感染| 第一胎打掉会有什么影响| 耳石症是什么原因| 肺结核阳性是什么意思| 吃刺猬有什么好处| 小麦和大麦有什么区别| 拉肚子应该挂什么科| 什么是宫颈息肉| 总头晕是什么原因| 什么叫npc| 抗原和抗体有什么区别| 叒字什么意思| 百香果的籽有什么功效| 泰坦尼克号女主角叫什么| 美育是什么| 自媒体是什么| 吃什么下奶| 眼睛雾化的作用是什么| 什么东西掉进水里不会湿| 黑标是什么意思| 38岁属什么生肖| 尘字五行属什么| 孕妇零食可以吃什么| 什么人容易得帕金森| 5月9号是什么星座| 晚上看到黄鼠狼什么预兆| 世界屋脊指的是什么| 红色玫瑰花代表什么意思| 什么远什么长| 克拉是什么单位| 私处痒是什么原因| 11月11日是什么星座| 小狗拉稀 吃什么药| 胃反流吃什么药好| 广西三月三是什么节日| 特异性是什么意思| 挺舌反应是什么| 地下党是什么意思| 梦见蛇什么意思| 哥文花园女装什么档次| 糖尿病患者能吃什么水果| 什么花什么门的成语| 替身是什么意思| 网络拒绝接入什么意思| 李嘉诚是什么国籍| 白细胞正常c反应蛋白高说明什么| 台湾为什么叫4v| 补牙用什么材料最好| 手机什么时候发明的| 查钙含量做什么检查| 苍耳是什么东西| 什么样的普洱茶才是好茶| 神经痛吃什么药好| 尿道口红肿用什么药| 梦见蝎子是什么意思| momo是什么意思| 一听是什么意思| 体检前一天晚上吃什么| 六月初一有什么讲究| 粥样动脉硬化吃什么药| 晚安好梦什么意思| 口了又一是什么字| 大秀是什么意思| 985大学什么意思| 什么生肖晚上不睡觉| 抽象是什么意思| 什么是主观什么是客观| 维生素b2有什么功效| 山药炖什么好吃| 哲字五行属什么| 小腿肿胀是什么原因| 感冒什么时候能好| b族维生素什么时候吃效果最好| 什么的成长| 眼皮一直跳是什么原因| 胎膜早破是什么症状| 交工是什么意思| 911是什么星座| 宫保鸡丁是什么菜系| 破血是什么意思| 动物园里有什么动物| 眼镜是什么时候发明的| 94年什么命| 中午是什么时辰| 急性肠胃炎有什么症状| 圣字五行属什么| 阴道痒是什么原因| 食管有烧灼感什么原因| 孕妇适合吃什么水果| cas号是什么| 银壶一般什么价位| 暑湿感冒吃什么药| 袁崇焕为什么杀毛文龙| 梦见吃杨梅是什么意思| 结扎对男人有什么伤害| 移植后要注意什么| 甲状腺在人体什么位置| 3.1号是什么星座| 人突然晕倒是什么原因引起的| 水过鸭背是什么意思| 什么可以减肥| 黄色裤子搭配什么颜色上衣| amiri是什么牌子| 2004属什么| 欲盖弥彰是什么意思| 尿检隐血十一什么意思| 身上长疮是什么原因引起的| 1069是什么意思| 总胆固醇高有什么危害| 高瞻远瞩是什么生肖| 三省吾身是什么意思| 马蜂蛰了用什么药| 六月八日是什么星座| 旭日东升是什么生肖| 桃花是什么颜色| 懒惰是什么意思| 白芷是什么| 疖子是什么原因引起的| 母亲是o型血孩子是什么血型| 兰州市区有什么好玩的地方| 心慌吃什么药| 梦见自己升职了是什么预兆| 混油皮是什么特征| 猫癣用什么药| 姚明什么时候退役的| 为什么会长胎记| 做梦梦到自己拉屎是什么意思| 悦字属于五行属什么| 白介素高说明什么| 小孩肠套叠什么症状| 中耳炎吃什么药最有效| 从政是什么意思| 双五行属什么| 茄子是什么意思| 赵本山什么时候去世的| 熊猫属于什么科| 盐酸苯海索片治什么病| 床上出现蜈蚣什么原因| 表姐的孩子叫我什么| 长得标致是什么意思| mpn是什么意思| 补铁的水果有什么| rapper什么意思| fossil是什么牌子| 牙龈萎缩吃什么药见效快| 洗假牙用什么洗最好| 什么是鸡奸| 胸前骨头疼是什么原因| 什么南瓜| 淋菌性尿道炎吃什么药| 生命是什么意思| 胃病吃什么水果好| 疑神疑鬼是什么意思| 强迫症什么意思| esse是什么牌子的烟| 急忙的反义词是什么| 小金鱼吃什么食物| 什么是性质| 肉炒什么菜谱大全| 今天会开什么生肖| siv是什么意思| 失独是什么意思| 火棉胶婴儿是什么意思| 颈椎病去医院挂什么科| 1954年属什么生肖| 经常放屁是什么原因造成的| 吃西洋参有什么好处| 上海话娘娘是什么意思| 十月是什么星座| 鱼油有什么作用| 梦见长大水是什么意思| 和谐的意思是什么| 减肥吃什么药好| 菜鸟是什么意思| 为什么会内分泌失调| 红细胞减少是什么原因| 肩胛骨疼痛是什么原因| 百度Jump to content

天津某装饰建材项目股权融资300万元-400万元

From Wikipedia, the free encyclopedia
百度 江苏干部群众始终牢记周恩来同志“依靠自己的聪明才智,自力更生、艰苦创业,建设美好家园”的谆谆嘱托,在他的伟大精神和崇高风范感召和激励下奋斗前行,不断谱写社会主义建设、改革和发展的新篇章。

In programming language theory, subtyping (also called subtype polymorphism or inclusion polymorphism) is a form of type polymorphism. A subtype is a datatype that is related to another datatype (the supertype) by some notion of substitutability, meaning that program elements (typically subroutines or functions), written to operate on elements of the supertype, can also operate on elements of the subtype.

If S is a subtype of T, the subtyping relation (written as S <: T,  S ? T,[1] or  S ≤: T ) means that any term of type S can safely be used in any context where a term of type T is expected. The precise semantics of subtyping here crucially depends on the particulars of how "safely be used" and "any context" are defined by a given type formalism or programming language. The type system of a programming language essentially defines its own subtyping relation, which may well be trivial, should the language support no (or very little) conversion mechanisms.

Due to the subtyping relation, a term may belong to more than one type. Subtyping is therefore a form of type polymorphism. In object-oriented programming the term 'polymorphism' is commonly used to refer solely to this subtype polymorphism, while the techniques of parametric polymorphism would be considered generic programming.

Functional programming languages often allow the subtyping of records. Consequently, simply typed lambda calculus extended with record types is perhaps the simplest theoretical setting in which a useful notion of subtyping may be defined and studied.[2] Because the resulting calculus allows terms to have more than one type, it is no longer a "simple" type theory. Since functional programming languages, by definition, support function literals, which can also be stored in records, records types with subtyping provide some of the features of object-oriented programming. Typically, functional programming languages also provide some, usually restricted, form of parametric polymorphism. In a theoretical setting, it is desirable to study the interaction of the two features; a common theoretical setting is system F<:. Various calculi that attempt to capture the theoretical properties of object-oriented programming may be derived from system F<:.

The concept of subtyping is related to the linguistic notions of hyponymy and holonymy. It is also related to the concept of bounded quantification in mathematical logic (see Order-sorted logic). Subtyping should not be confused with the notion of (class or object) inheritance from object-oriented languages;[3] subtyping is a relation between types (interfaces in object-oriented parlance) whereas inheritance is a relation between implementations stemming from a language feature that allows new objects to be created from existing ones. In a number of object-oriented languages, subtyping is called interface inheritance, with inheritance referred to as implementation inheritance.

Origins

[edit]

The notion of subtyping in programming languages dates back to the 1960s; it was introduced in Simula derivatives. The first formal treatments of subtyping were given by John C. Reynolds in 1980 who used category theory to formalize implicit conversions, and Luca Cardelli (1985).[4]

The concept of subtyping has gained visibility (and synonymy with polymorphism in some circles) with the mainstream adoption of object-oriented programming. In this context, the principle of safe substitution is often called the Liskov substitution principle, after Barbara Liskov who popularized it in a keynote address at a conference on object-oriented programming in 1987. Because it must consider mutable objects, the ideal notion of subtyping defined by Liskov and Jeannette Wing, called behavioral subtyping is considerably stronger than what can be implemented in a type checker. (See § Function types below for details.)

Examples

[edit]
Example of subtypes: where bird is the supertype and all others are subtypes as denoted by the arrow in UML notation

A simple practical example of subtypes is shown in the diagram. The type "bird" has three subtypes "duck", "cuckoo" and "ostrich". Conceptually, each of these is a variety of the basic type "bird" that inherits many "bird" characteristics but has some specific differences. The UML notation is used in this diagram, with open-headed arrows showing the direction and type of the relationship between the supertype and its subtypes.

As a more practical example, a language might allow integer values to be used wherever floating point values are expected (Integer <: Float), or it might define a generic type Number as a common supertype of integers and the reals. In this second case, we only have Integer <: Number and Float <: Number, but Integer and Float are not subtypes of each other.

Programmers may take advantage of subtyping to write code in a more abstract manner than would be possible without it. Consider the following example:

function max (x as Number, y as Number) is
    if x < y then
        return y
    else
        return x
end

If integer and real are both subtypes of Number, and an operator of comparison with an arbitrary Number is defined for both types, then values of either type can be passed to this function. However, the very possibility of implementing such an operator highly constrains the Number type (for example, one can't compare an integer with a complex number), and actually only comparing integers with integers, and reals with reals, makes sense. Rewriting this function so that it would only accept 'x' and 'y' of the same type requires bounded polymorphism.

Subtyping enables a given type to be substituted for another type or abstraction. Subtyping is said to establish an is-a relationship between the subtype and some existing abstraction, either implicitly or explicitly, depending on language support. The relationship can be expressed explicitly via inheritance in languages that support inheritance as a subtyping mechanism.

C++

[edit]

The following C++ code establishes an explicit inheritance relationship between classes B and A, where B is both a subclass and a subtype of A, and can be used as an A wherever a B is specified (via a reference, a pointer or the object itself).

class A
{ public:
   void DoSomethingALike() const {}
};

class B : public A
{ public:
   void DoSomethingBLike() const {}
};

void UseAnA(A const& some_A)
{
   some_A.DoSomethingALike();
}

void SomeFunc()
{
   B b;
   UseAnA(b); // b can be substituted for an A.
}

[5]

Python

[edit]

The following python code establishes an explicit inheritance relationship between classes B and A, where B is both a subclass and a subtype of A, and can be used as an A wherever a B is required.

class A:
    def do_something_a_like(self):
        pass

class B(A):
    def do_something_b_like(self):
        pass

def use_an_a(some_a):
    some_a.do_something_a_like()

def some_func():
    b = B()
    use_an_a(b)  # b can be substituted for an A.

The following example, type(a) is a "regular" type, and type(type(a)) is a metatype. While as distributed all types have the same metatype (PyType_Type, which is also its own metatype), this is not a requirement. The type of classic classes, known as types.ClassType, can also be considered a distinct metatype.[6]

>>> a = 0
>>> type(a)
<type 'int'>
>>> type(type(a))
<type 'type'>
>>> type(type(type(a)))
<type 'type'>
>>> type(type(type(type(a))))
<type 'type'>

Java

[edit]

In Java, is-a relation between the type parameters of one class or interface and the type parameters of another are determined by the extends and implements clauses.

Using the Collections classes, ArrayList<E> implements List<E>, and List<E> extends Collection<E>. So ArrayList<String> is a subtype of List<String>, which is a subtype of Collection<String>. The subtyping relationship is preserved between the types automatically. When defining an interface, PayloadList, that associates an optional value of generic type P with each element, its declaration might look like:

interface PayloadList<E, P> extends List<E> {
    void setPayload(int index, P val);
    ...
}

The following parameterizations of PayloadList are subtypes of List<String>:

PayloadList<String, String>
PayloadList<String, Integer>
PayloadList<String, Exception>

Subsumption

[edit]

In type theory the concept of subsumption[7] is used to define or evaluate whether a type S is a subtype of type T.

A type is a set of values. The set can be described extensionally by listing all the values, or it can be described intensionally by stating the membership of the set by a predicate over a domain of possible values. In common programming languages enumeration types are defined extensionally by listing values. User-defined types like records (structs, interfaces) or classes are defined intensionally by an explicit type declaration or by using an existing value, which encodes type information, as a prototype to be copied or extended.

In discussing the concept of subsumption, the set of values of a type is indicated by writing its name in mathematical italics: T. The type, viewed as a predicate over a domain, is indicated by writing its name in bold: T. The conventional symbol <: means "is a subtype of", and :> means "is a supertype of".[citation needed]

  • A type T subsumes S if the set of values T which it defines, is a superset of the set S, so that every member of S is also a member of T.
  • A type may be subsumed by more than one type: the supertypes of S intersect at S.
  • If S <: T (and therefore S ? T ), then T, the predicate which circumscribes the set T, must be part of the predicate S (over the same domain) which defines S.
  • If S subsumes T, and T subsumes S, then the two types are equal (although they may not be the same type if the type system distinguishes types by name).

In terms of information specificity, a subtype is considered more specific than any one of its supertypes, because it holds at least as much information as each of them. This may increase the applicability, or relevance of the subtype (the number of situations where it can be accepted or introduced), as compared to its "more general" supertypes. The disadvantage of having this more detailed information is that it represents incorporated choices which reduce the prevalence of the subtype (the number of situations which are able to generate or produce it).

In the context of subsumption, the type definitions can be expressed using Set-builder notation, which uses a predicate to define a set. Predicates can be defined over a domain (set of possible values) D. Predicates are partial functions that compare values to selection criteria. For example: "is an integer value greater than or equal to 100 and less than 200?". If a value matches the criteria then the function returns the value. If not, the value is not selected, and nothing is returned. (List comprehensions are a form of this pattern used in many programming languages.)

If there are two predicates, which applies selection criteria for the type T, and which applies additional criteria for the type S, then sets for the two types can be defined:

The predicate is applied alongside as part of the compound predicate S defining S. The two predicates are conjoined, so both must be true for a value to be selected. The predicate subsumes the predicate T, so S <: T.

For example: there is a subfamily of cat species called Felinae, which is part of the family Felidae. The genus Felis, to which the domestic cat species Felis catus belongs, is part of that subfamily.

The conjunction of predicates has been expressed here through application of the second predicate over the domain of values conforming to the first predicate. Viewed as types, Felis <: Felinae <: Felidae.

If T subsumes S (T :> S) then a procedure, function or expression given a value as an operand (parameter value or term) will therefore be able to operate over that value as one of type T, because . In the example above, we could expect the function ofSubfamily to be applicable to values of all three types Felidae, Felinae and Felis.

Subtyping schemes

[edit]

Type theorists make a distinction between nominal subtyping, in which only types declared in a certain way may be subtypes of each other, and structural subtyping, in which the structure of two types determines whether or not one is a subtype of the other. The class-based object-oriented subtyping described above is nominal; a structural subtyping rule for an object-oriented language might say that if objects of type A can handle all of the messages that objects of type B can handle (that is, if they define all the same methods), then A is a subtype of B regardless of whether either inherits from the other. This so-called duck typing is common in dynamically typed object-oriented languages. Sound structural subtyping rules for types other than object types are also well known.[citation needed]

Implementations of programming languages with subtyping fall into two general classes: inclusive implementations, in which the representation of any value of type A also represents the same value at type B if A <: B, and coercive implementations, in which a value of type A can be automatically converted into one of type B. The subtyping induced by subclassing in an object-oriented language is usually inclusive; subtyping relations that relate integers and floating-point numbers, which are represented differently, are usually coercive.

In almost all type systems that define a subtyping relation, it is reflexive (meaning A <: A for any type A) and transitive (meaning that if A <: B and B <: C then A <: C). This makes it a preorder on types.

Record types

[edit]

Width and depth subtyping

[edit]

Types of records give rise to the concepts of width and depth subtyping. These express two different ways of obtaining a new type of record that allows the same operations as the original record type.

Recall that a record is a collection of (named) fields. Since a subtype is a type which allows all operations allowed on the original type, a record subtype should support the same operations on the fields as the original type supported.

One kind of way to achieve such support, called width subtyping, adds more fields to the record. More formally, every (named) field appearing in the width supertype will appear in the width subtype. Thus, any operation feasible on the supertype will be supported by the subtype.

The second method, called depth subtyping, replaces the various fields with their subtypes. That is, the fields of the subtype are subtypes of the fields of the supertype. Since any operation supported for a field in the supertype is supported for its subtype, any operation feasible on the record supertype is supported by the record subtype. Depth subtyping only makes sense for immutable records: for example, you can assign 1.5 to the 'x' field of a real point (a record with two real fields), but you can't do the same to the 'x' field of an integer point (which, however, is a deep subtype of the real point type) because 1.5 is not an integer (see Variance).

Subtyping of records can be defined in System F<:, which combines parametric polymorphism with subtyping of record types and is a theoretical basis for many functional programming languages that support both features.

Some systems also support subtyping of labeled disjoint union types (such as algebraic data types). The rule for width subtyping is reversed: every tag appearing in the width subtype must appear in the width supertype.

Function types

[edit]

If T1T2 is a function type, then a subtype of it is any function type S1S2 with the property that T1 <: S1 and S2 <: T2. This can be summarised using the following typing rule:

The parameter type of S1S2 is said to be contravariant because the subtyping relation is reversed for it, whereas the return type is covariant. Informally, this reversal occurs because the refined type is "more liberal" in the types it accepts and "more conservative" in the type it returns. This is what exactly works in Scala: a n-ary function is internally a class that inherits the trait (which can be seen as a general interface in Java-like languages), where are the parameter types, and is its return type; "?" before the type means the type is contravariant while "+" means covariant.

In languages that allow side effects, like most object-oriented languages, subtyping is generally not sufficient to guarantee that a function can be safely used in the context of another. Liskov's work in this area focused on behavioral subtyping, which besides the type system safety discussed in this article also requires that subtypes preserve all invariants guaranteed by the supertypes in some contract.[8] This definition of subtyping is generally undecidable, so it cannot be verified by a type checker.

The subtyping of mutable references is similar to the treatment of parameter values and return values. Write-only references (or sinks) are contravariant, like parameter values; read-only references (or sources) are covariant, like return values. Mutable references which act as both sources and sinks are invariant.

Relationship with inheritance

[edit]

Subtyping and inheritance are independent (orthogonal) relationships. They may coincide, but none is a special case of the other. In other words, between two types S and T, all combinations of subtyping and inheritance are possible:

  1. S is neither a subtype nor a derived type of T
  2. S is a subtype but is not a derived type of T
  3. S is not a subtype but is a derived type of T
  4. S is both a subtype and a derived type of T

The first case is illustrated by independent types, such as Boolean and Float.

The second case can be illustrated by the relationship between Int32 and Int64. In most object oriented programming languages, Int64 are unrelated by inheritance to Int32. However Int32 can be considered a subtype of Int64 since any 32 bit integer value can be promoted into a 64 bit integer value.

The third case is a consequence of function subtyping input contravariance. Assume a super class of type T having a method m returning an object of the same type (i.e. the type of m is TT, also note that the first parameter of m is this/self) and a derived class type S from T. By inheritance, the type of m in S is SS.[citation needed] In order for S to be a subtype of T the type of m in S must be a subtype of the type of m in T [citation needed], in other words: SS ≤: TT. By bottom-up application of the function subtyping rule, this means: S ≤: T and T ≤: S, which is only possible if S and T are the same. Since inheritance is an irreflexive relation, S can't be a subtype of T.

Subtyping and inheritance are compatible when all inherited fields and methods of the derived type have types which are subtypes of the corresponding fields and methods from the inherited type .[3]

Coercions

[edit]

In coercive subtyping systems, subtypes are defined by explicit type conversion functions from subtype to supertype. For each subtyping relationship (S <: T), a coercion function coerce: ST is provided, and any object s of type S is regarded as the object coerceST(s) of type T. A coercion function may be defined by composition: if S <: T and T <: U then s may be regarded as an object of type u under the compound coercion (coerceTU ° coerceST). The type coercion from a type to itself coerceTT is the identity function idT.

Coercion functions for records and disjoint union subtypes may be defined componentwise; in the case of width-extended records, type coercion simply discards any components which are not defined in the supertype. The type coercion for function types may be given by f'(t) = coerceS2T2(f(coerceT1S1(t))), reflecting the contravariance of parameter values and covariance of return values.

The coercion function is uniquely determined given the subtype and supertype. Thus, when multiple subtyping relationships are defined, one must be careful to guarantee that all type coercions are coherent. For instance, if an integer such as 2 : int can be coerced to a floating point number (say, 2.0 : float), then it is not admissible to coerce 2.1 : float to 2 : int, because the compound coercion coercefloatfloat given by coerceintfloat ° coercefloatint would then be distinct from the identity coercion idfloat.

See also

[edit]

Notes

[edit]
  1. ^ Copestake, Ann. Implementing typed feature structure grammars. Vol. 110. Stanford: CSLI publications, 2002.
  2. ^ Cardelli, Luca. A semantics of multiple inheritance. In G. Kahn, D. MacQueen, and G. Plotkin, editors, Semantics of Data Types, volume 173 of Lecture Notes in Computer Science, pages 51–67. Springer-Verlag, 1984. Full version in Information and Computation, 76(2/3):138–164, 1988.
  3. ^ a b Cook, Hill & Canning 1990.
  4. ^ Pierce, ch. 15 notes
  5. ^ Mitchell, John (2002). "10 "Concepts in object-oriented languages"". Concepts in programming language. Cambridge, UK: Cambridge University Press. p. 287. ISBN 0-521-78098-5.
  6. ^ Guido van Rossum. "Subtyping Built-in Types". Retrieved 2 October 2012.
  7. ^ Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002, 15.1 "Subsumption", p. 181-182
  8. ^ Barbara Liskov, Jeannette Wing, A behavioral notion of subtyping, ACM Transactions on Programming Languages and Systems, Volume 16, Issue 6 (November 1994), pp. 1811–1841. An updated version appeared as CMU technical report: Liskov, Barbara; Wing, Jeannette (July 1999). "Behavioral Subtyping Using Invariants and Constraints" (PS). Retrieved 2025-08-05.

References

[edit]

Textbooks

  • Benjamin C. Pierce, Types and programming languages, MIT Press, 2002, ISBN 0-262-16209-1, chapter 15 (subtyping of record types), 19.3 (nominal vs. structural types and subtyping), and 23.2 (varieties of polymorphism)
  • C. Szyperski, D. Gruntz, S. Murer, Component software: beyond object-oriented programming, 2nd ed., Pearson Education, 2002, ISBN 0-201-74572-0, pp. 93–95 (a high-level presentation aimed at programming language users)

Papers

Cook, William R.; Hill, Walter; Canning, Peter S. (1990). Inheritance is not subtyping. Proc. 17th ACM SIGPLAN-SIGACT Symp. on Principles of Programming Languages (POPL). pp. 125–135. CiteSeerX 10.1.1.102.8635. doi:10.1145/96709.96721. ISBN 0-89791-343-4.
  • Reynolds, John C. Using category theory to design implicit conversions and generic operators. In N. D. Jones, editor, Proceedings of the Aarhus Workshop on Semantics-Directed Compiler Generation, number 94 in Lecture Notes in Computer Science. Springer-Verlag, January 1980. Also in Carl A. Gunter and John C. Mitchell, editors, Theoretical Aspects of Object-Oriented Programming: Types, Semantics, and Language Design (MIT Press, 1994).

Further reading

[edit]
尿里有潜血是什么原因 beer是什么意思 m代表什么意思 突然是什么意思 脑溢血是什么原因
来年是什么意思 干咳是什么原因引起的 女性一般什么年龄绝经 肚子里的蛔虫是什么意思 pf什么意思
生力军什么意思 夸父是一个什么样的人 什么是菜花病 睡醒后口干口苦是什么原因 奇门遁甲是什么意思
10月17日什么星座 飞秒是什么 羊肚是羊的什么部位 风花雪月什么意思 依然如故的故是什么意思
肺部肿瘤不能吃什么hcv9jop2ns6r.cn 荨麻疹挂什么科hcv8jop3ns3r.cn 腿上无缘无故出现淤青是什么原因hcv8jop6ns3r.cn 取保候审是什么意思还会判刑吗hcv9jop8ns0r.cn 喉咙痒咳嗽有痰是什么原因hcv9jop4ns9r.cn
梦见老公出轨预示什么hcv8jop0ns2r.cn 上海话娘娘是什么意思hcv9jop6ns9r.cn 煤气是什么味道hcv9jop6ns1r.cn 吃什么可降低胆固醇hcv9jop6ns3r.cn 高血压吃什么好降压快hcv8jop2ns7r.cn
雪燕是什么东西bfb118.com 脱肛是什么症状zhiyanzhang.com 吃面是什么意思hcv9jop3ns7r.cn 匡威属于什么档次hcv8jop0ns9r.cn 农历8月20日是什么星座hcv9jop6ns9r.cn
屈曲是什么意思hcv8jop2ns1r.cn 芡实有什么功效hcv8jop0ns2r.cn 吃过饭后就想拉大便是什么原因hcv7jop6ns7r.cn 折煞是什么意思hcv8jop3ns4r.cn 王代表什么生肖hcv9jop5ns3r.cn
百度