<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Typinferenz</id>
	<title>Typinferenz - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Typinferenz"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Typinferenz&amp;action=history"/>
	<updated>2026-06-07T07:56:23Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Typinferenz&amp;diff=477778&amp;oldid=prev</id>
		<title>imported&gt;Hoo man: Änderung 234067567 von Clavismax rückgängig gemacht; per Kommentar: Das ist keine vollständige Liste und wir haben hier genug Beispiele</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Typinferenz&amp;diff=477778&amp;oldid=prev"/>
		<updated>2023-05-27T11:06:35Z</updated>

		<summary type="html">&lt;p&gt;Änderung &lt;a href=&quot;/index.php/Spezial:Diff/234067567&quot; title=&quot;Spezial:Diff/234067567&quot;&gt;234067567&lt;/a&gt; von &lt;a href=&quot;/index.php/Spezial:Beitr%C3%A4ge/Clavismax&quot; title=&quot;Spezial:Beiträge/Clavismax&quot;&gt;Clavismax&lt;/a&gt; rückgängig gemacht; per Kommentar: Das ist keine vollständige Liste und wir haben hier genug Beispiele&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Durch &amp;#039;&amp;#039;&amp;#039;Typinferenz&amp;#039;&amp;#039;&amp;#039; ({{enS|&amp;#039;&amp;#039;Type inference &amp;#039;&amp;#039;}} mit {{lang|en|&amp;#039;&amp;#039;type&amp;#039;&amp;#039;}} „(Daten-)Art“ oder „[[Datentyp]]“ und {{lang|en|&amp;#039;&amp;#039;inference&amp;#039;&amp;#039;}} „Schlussfolgerung“), auch &amp;#039;&amp;#039;&amp;#039;Typableitung&amp;#039;&amp;#039;&amp;#039; genannt, kann in manchen (stark typisierten) [[Programmiersprache]]n viel Schreibarbeit eingespart werden, indem auf die Niederschrift von Typangaben verzichtet wird, die aus den restlichen Angaben und den Typisierungsregeln hergeleitet (rekonstruiert) werden können; dazu bedient man sich derselben Regeln, die auch zur Typprüfung dienen, als deren Fortentwicklung die Typinferenz in gewisser Weise anzusehen ist. Bei der Durchführung bestimmt man durch [[Unifikation (Logik)|Unifikation]] den allgemeinsten Typ (Haupttyp, &amp;#039;&amp;#039;principal type&amp;#039;&amp;#039;) eines Terms.&lt;br /&gt;
&lt;br /&gt;
Die Entwicklung der Typinferenz (für [[ML (Programmiersprache)|ML]]) durch [[Robin Milner|Milner]]&amp;lt;ref group=&amp;quot;Anm&amp;quot;&amp;gt;Er hat wiederentdeckt, was schon von Hindley (1969), unter Rückgriff auf Ideen von [[Haskell Curry|Curry]] aus den 1950er Jahren, gefunden worden war. &amp;#039;&amp;#039;Pierce, TAPL, 336.&amp;#039;&amp;#039;&amp;lt;/ref&amp;gt; war ein Meilenstein in der Entwicklung der Programmiersprachen. Sie bedingte, ermöglichte aber zugleich auch anspruchsvollere [[Typsystem]]e, die damit erheblich an Bedeutung gewannen. Gewisse Spracheigenschaften wie [[Typumwandlung|Typanpassung]]en und manchmal [[Überladen]] wurden zurückgedrängt, weil sie mit der Typinferenz kollidieren.&lt;br /&gt;
&lt;br /&gt;
Viele Programmiersprachen unterstützen Typinferenz, zum Beispiel: [[Python (Programmiersprache)|Python]], [[Java (Programmiersprache)|Java]], [[C++11]], [[C-Sharp|C#]] und [[Visual Basic .NET#2005–2007: Visual Basic 8 und 9|Visual Basic]].&amp;lt;!-- keine vollständige Liste, die ersten 5 Sprachen nach dem TIOBE-Index reichen aus.  --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Gegeben sei der folgende Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
int a = 1;&lt;br /&gt;
int b = 2;&lt;br /&gt;
auto c = a + b;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei kann das &amp;#039;&amp;#039;Typsystem&amp;#039;&amp;#039; der jeweiligen Programmiersprache (wenn sie ein entsprechendes Typsystem samt striktem Regelwerk besitzt) nun automatisch herleiten, dass die Variable &amp;#039;&amp;#039;c&amp;#039;&amp;#039; vom Typ &amp;#039;&amp;#039;int&amp;#039;&amp;#039; ([[Integer (Datentyp)|Integer]]) sein muss, da das Ergebnis einer &amp;#039;&amp;#039;int&amp;#039;&amp;#039;-Addition ebenfalls vom Typ &amp;#039;&amp;#039;int&amp;#039;&amp;#039; ist.&lt;br /&gt;
&lt;br /&gt;
Typinferenz ist wichtig, um dem Programmierer zu helfen, Flüchtigkeitsfehler schnell zu entdecken. In einer streng typisierten Sprache wie [[SML (Programmiersprache)|SML]] ist es zum Beispiel nicht möglich, ganze Zahlen mit [[Boolesche Variable|booleschen Werten]] zu vergleichen. Um genau solche Fehler zu vermeiden und zu finden, werden mittels Typinferenz für alle Ausdrücke Typen hergeleitet, und es wird geprüft, ob alle auf den Ausdrücken ausgeführten Operationen typkonform sind (wenn z.&amp;amp;nbsp;B. wie oben angenommen Additionen nur zwischen zwei Zahlen gleichen Typs erlaubt sind).&lt;br /&gt;
&lt;br /&gt;
Ein etwas komplexeres Beispiel für die Typinferenz ist die Herleitung des Typs der Funktion &amp;#039;&amp;#039;f&amp;#039;&amp;#039; im folgenden SML-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ocaml&amp;quot;&amp;gt;&lt;br /&gt;
fun f(a, b, c) = if b then a(b) else c + 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zunächst muss die Variable &amp;#039;&amp;#039;b&amp;#039;&amp;#039; vom Typ &amp;#039;&amp;#039;bool&amp;#039;&amp;#039; (Wahrheitswert) sein, da sie im if-then-else statement nach dem &amp;#039;&amp;#039;if&amp;#039;&amp;#039; steht. Als zweites kann man sagen, dass die gesamte Funktion ein &amp;#039;&amp;#039;int&amp;#039;&amp;#039; zurückgeben muss, da sowohl der &amp;#039;&amp;#039;then&amp;#039;&amp;#039;- als auch der &amp;#039;&amp;#039;else&amp;#039;&amp;#039;-Teil denselben Typ haben müssen und &amp;#039;&amp;#039;&amp;lt;code&amp;gt;c + 1&amp;lt;/code&amp;gt;&amp;#039;&amp;#039; vom Typ int sein muss, da 1 vom Typ &amp;#039;&amp;#039;int&amp;#039;&amp;#039; ist, und somit auch –&amp;amp;nbsp;wegen des Plus-Operators&amp;amp;nbsp;– c vom Typ int sein muss. Nun kann man noch sagen, dass &amp;#039;&amp;#039;a&amp;#039;&amp;#039; eine Funktion sein muss, da im then-Teil a auf b angewendet wird. Da &amp;#039;&amp;#039;then&amp;#039;&amp;#039;- und &amp;#039;&amp;#039;else&amp;#039;&amp;#039;-Teil jedoch denselben Rückgabetyp haben müssen, muss das Ergebnis von der Funktion &amp;#039;&amp;#039;a&amp;#039;&amp;#039;, angewendet auf &amp;#039;&amp;#039;b&amp;#039;&amp;#039;, ebenfalls vom Typ &amp;#039;&amp;#039;int&amp;#039;&amp;#039; sein. Somit ergibt sich für die Funktion f folgender Typ:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ocaml&amp;quot;&amp;gt;&lt;br /&gt;
f : ((bool-&amp;gt;int) * bool * int) -&amp;gt; int&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Anmerkung:&amp;#039;&amp;#039;&amp;#039; Beim obigen Beispiel wurden explizit die Typisierungsregeln der Sprache [[Standard ML|SML]] verwendet. Andere Sprachen wie [[C++]] oder [[Java (Programmiersprache)|Java]] haben andere Typisierungsregeln, sodass die Typherleitung dort anders aussehen kann oder eventuell aufgrund der schwachen Typisierung der Sprache (es sind an vielen Stellen mehrere verschiedene Typen erlaubt) gar nicht möglich ist.&lt;br /&gt;
&lt;br /&gt;
== Hindley-Milner ==&lt;br /&gt;
{{Hauptartikel|Typinferenz nach Hindley-Milner}}&lt;br /&gt;
&lt;br /&gt;
Hindley-Milner (HM) ist ein klassisches Verfahren der Typinferenz mit [[Polymorphie (Programmierung)#Parametrische Polymorphie|parametrischem Polymorphismus]] für den [[Lambda-Kalkül]]. Es wurde erstmals von [[J. Roger Hindley]]&amp;lt;ref&amp;gt;R. Hindley: &amp;#039;&amp;#039;The Principal Type-Scheme of an Object in Combinatory Logic&amp;#039;&amp;#039;. In: &amp;#039;&amp;#039;Transactions of the American Mathematical Society&amp;#039;&amp;#039;, Vol. 146, 1969, S. 29–60 [http://www.jstor.org/stable/1995158 jstor.org]&amp;lt;/ref&amp;gt; beschrieben und später von [[Robin Milner]]&amp;lt;ref&amp;gt;Milner: &amp;#039;&amp;#039;A Theory of Type Polymorphism in Programming&amp;#039;&amp;#039;. In: &amp;#039;&amp;#039;Journal of Computer and System Science&amp;#039;&amp;#039; (JCSS), 17, 1978, S. 348–374, [https://homepages.inf.ed.ac.uk/wadler/papers/papers-we-love/milner-type-polymorphism.pdf online] (PDF; 1,6&amp;amp;nbsp;MB)&amp;lt;/ref&amp;gt; wiederentdeckt.&lt;br /&gt;
[[Luis Damas]] trug eine genaue formale Analyse und einen Beweis der Methode in seiner Doktorarbeit&amp;lt;ref&amp;gt;Luis Damas: &amp;#039;&amp;#039;Type Assignment in Programming Languages&amp;#039;&amp;#039;. PhD thesis, University of Edinburgh, 1985 (CST-33-85)&amp;lt;/ref&amp;gt; bei, weshalb das Verfahren auch als [[Damas-Milner]]&amp;lt;ref name=&amp;quot;Damas&amp;quot;&amp;gt;Damas, Milner: {{Internetquelle | url=https://web.cs.wpi.edu/~cs4536/c12/milner-damas_principal_types.pdf | abruf=2020-05-21 | titel=&amp;#039;&amp;#039;Principal type-schemes for functional programs&amp;#039;&amp;#039;. }} (PDF) 9th Symposium on Principles of programming languages (POPL’82), ACM, 1982, S. 207–212.&amp;lt;/ref&amp;gt; bezeichnet wird. Unter den herausragenden Eigenschaften des HM sind Vollständigkeit und die Fähigkeit, den allgemeinsten Typen einer gegebenen Quelle ohne Notwendigkeit von [[Typisierung (Informatik)#Typsystem|Annotationen]] oder sonstigen Hinweisen zu bestimmen. HM ist ein effizientes Verfahren, das die Typisierung nahezu in linearer Zeit bzgl. der Größe der Quelle ermitteln kann, womit es praktisch für die Erstellung großer Programme ist. HM wird bevorzugt in [[Funktionale Programmierung|funktionalen Sprachen]] eingesetzt. Es wurde erstmals als Teil &amp;lt;!-- des Sortenapparts AUSKOMMENTIERT WEIL UNVERSTÄNDLICH --&amp;gt; der Programmiersprache [[ML (Programmiersprache)|ML]] implementiert. Seither wurde HM in verschiedenster Weise erweitert, insbesondere durch beschränkte Typen, wie sie in [[Haskell (Programmiersprache)|Haskell]] verwendet werden.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Typisierung (Informatik)|Typisierung]]&lt;br /&gt;
* [[Typsicherheit]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* Luca Cardelli: [http://lucacardelli.name/Papers/BasicTypechecking.pdf &amp;#039;&amp;#039;Basic polymorphic type checking&amp;#039;&amp;#039;.] In: &amp;#039;&amp;#039;Science of Computer Programming&amp;#039;&amp;#039;, 8(2), 1987.&lt;br /&gt;
* Ralf Hartmut Güting, Martin Erwig: &amp;#039;&amp;#039;Übersetzerbau&amp;#039;&amp;#039;. Springer, Berlin / Heidelberg 1999, ISBN 3-540-65389-9&lt;br /&gt;
* Benjamin C. Pierce: &amp;#039;&amp;#039;Types and programming languages.&amp;#039;&amp;#039; MIT Press, Cambridge MA 2002, ISBN 978-0-262-16209-8&lt;br /&gt;
&lt;br /&gt;
== Anmerkungen ==&lt;br /&gt;
&amp;lt;references group=&amp;quot;Anm&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Typentheorie]]&lt;br /&gt;
[[Kategorie:Datentyp]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Hoo man</name></author>
	</entry>
</feed>