type-inference

___ qstntxt ___

Ich versuche zu verstehen, warum die Funktion

%Vor%

hat den Typ

%Vor%

Wie kann "filter fst" funktionieren, wenn der Filter eine Funktion erhalten muss, die einen Bool-Typ zurückgibt und fst nur das erste Element eines Tupels zurückgibt?

%Vor%

Kann mir jemand das erklären? Danke;)

    
___ answer22505125 ___

%code% ist eine Funktion, die einen booleschen Wert zurückgibt, solange Sie die Tupel auf ein boolesches Element als ihr erstes Element beschränken (das zweite Element kann alles sein, also das %code%

)     
___ answer22505144 ___
%Vor%

Aber wir könnten auch Typvariablen für %code% austauschen, um:

zu erhalten %Vor%

Also hat das erste Argument von %code% den Typ %code% , während %code% selbst %code% ist. Jetzt versuchen wir, dies zu kombinieren (ich glaube, das wird Vereinigung genannt):

%Vor%

Daraus können wir schließen, dass %code% %code% sein muss (da die rechte Seite gleich sein muss) und erhalten:

%Vor%

Aus dem Obigen folgern wir, dass %code% %code% sein muss, und erhalten:

%Vor%

Und wir sind fertig.

    
___ answer22505355 ___
  

Wie kann "filter fst" funktionieren, wenn der Filter eine Funktion erhalten muss, die einen Bool-Typ zurückgibt und fst nur das erste Element eines Tupels zurückgibt?

In gewissem Sinne haben Sie Ihre eigene Frage beantwortet! Lass es uns aufteilen:

  

filter muss eine Funktion erhalten, die einen Bool-Type

zurückgibt

OK, also schauen wir uns an, was Sie weitergeben: %code% . Ist %code% eine Funktion? Ja, ist es, also haben wir den ersten Teil runter. Gibt es %code% zurück? Nun, schauen wir uns an, was es macht:

  

fst gibt nur das erste Element eines Tupels zurück

Wenn also das erste Element eines Tupels ein %code% ist, dann gibt es ja ein bool! Wenn das erste Element eines Tupels etwas anderes als %code% ist, wird die Typprüfung jedoch nicht ausgeführt und wird auch nicht ausgeführt.

Sehen wir uns noch einmal die Typen an, die Sie aufstellen. Ich werde die Namen der Typvariablen ändern, nur um die Dinge klarer zu machen:

%Vor%

%code% nimmt eine %code% und gibt eine %code% zurück, und der Filter erwartet eine Funktion, die eine %code% und eine %code% zurückgibt. Wir geben %code% weiter, also muss %code% über %code% sein, da dies der erste Parameter von %code% ist. Der Rückgabewert der Funktion, die wir in %code% übergeben, muss ein %code% sein, also muss %code% oben ein %code% sein. Und %code% kann alles sein, weil es überhaupt nicht vom Filter verwendet wird. Durch Einsetzen der Werte für %code% und %code% erhalten wir einen endgültigen Typ für %code% von:

%Vor%

Schließlich ist der Typ von %code% :

%Vor%

(Auch hier habe ich die Typvariablen umbenannt, nur um sie von den oben genannten Typen zu unterscheiden, aber denken Sie daran, dass es nicht wirklich wichtig ist, wie sie heißen, solange sie konsistent sind Umfang der Typ Annotation)

%code% übergibt den oben definierten %code% als ersten Parameter an %code% . Wenn wir den Parameter für %code% und das Ergebnis für %code% ersetzen, können wir sehen, dass diese Funktion %code% sein muss, mit anderen Worten, sowohl %code% als auch %code% sind %code% . Wenn wir diese in die Funktion einbinden, gelangen wir zum endgültigen Typ:

%Vor%     
___ answer22505500 ___

Da ich dies bereits geschrieben habe, bevor danielpwrights Antwort gepostet wurde, poste ich es trotzdem. Ich gehe gerade meinen Denkprozess für den Typ von %code% durch.

Schreiben Sie zuerst die Typ-Signaturen auf (ändern Sie fst, damit seine Variablennamen nicht mit denen des Filters kollidieren):

%Vor%

Übereinstimmung %code% mit %code% :

%code% muss %code% sein, was bedeutet, dass %code% %code%

sein muss

Durch die Spezialisierung von %code% mit dieser Information wird es:

%Vor%

was zu

führt %Vor%     
___ tag123haskell ___ Haskell ist eine funktionale Programmiersprache mit starker statischer Typisierung, verzögerungsfreier Auswertung, umfangreicher Parallelitäts- und Parallelitätsunterstützung und einzigartigen Abstraktionsfunktionen. ___ answer22511780 ___

Sie müssen wirklich nur einige Gleichungen lösen. Fangen wir an:

%Vor%

Daher ist %code% wobei %code% die Lösung der folgenden Gleichung ist:

%Vor%

was impliziert

%Vor%

was impliziert

%Vor%

Daher %code% .

Jetzt haben wir:

%Vor%

Also, %code% , wobei %code% und %code% durch die folgende Typgleichung gegeben sind:

%Vor%

was impliziert

%Vor%

Daher %code% .

    
___ tag123types ___ Typen und Typsysteme werden verwendet, um Abstraktionsstufen in Programmen zu erzwingen. ___ tag123funktionale Programmierung ___ Funktionale Programmierung ist ein Programmierparadigma, das auf der Erzeugung von Abstraktionen unter Verwendung von Funktionen basiert, die Nebeneffekte und Zustandsänderungen vermeidet. Reine funktionale Programmierung ist threadsicher. ___ answer22538099 ___

Wie andere getan haben, möchte ich hier die Typgleichungen lösen; aber ich möchte sie auf eine visuellere Weise aufschreiben, damit die Ableitung auf eine automatische Weise durchgeführt werden kann. Mal sehen.

%Vor%

Rein mechanisches Zeug. :) Damit,

%Vor%

Die Typvariablen im letzten Typ können zur besseren Lesbarkeit frei umbenannt werden (in einer konsistenten Art und Weise).

Das einzige, was meine Antwort zu dem, was bereits in anderen Antworten gezeigt wurde, hinzufügt, ist dieser Rat (den ich für wichtig halte): Wenn Sie dieser einfachen Disziplin folgen, eine Sache unter die andere zu schreiben wird es sehr einfach, diese Typ-Vereinheitlichungen sehr mechanisch und automatisch durchzuführen (wodurch die Möglichkeit von Fehlern verringert wird).

Für ein weiteres Beispiel, einschließlich eines eigentlichen Prolog-Programms zur Typableitung, siehe Haskell: wie man den Typ von ein Ausdruck manuell .

    
___ tag123unification ___ Vereinheitlichung ist in Informatik und Logik ein algorithmischer Prozess, mit dem man versucht, das Erfüllbarkeitsproblem zu lösen. Das Ziel der Vereinigung ist es, eine Substitution zu finden, die zeigt, dass zwei scheinbar unterschiedliche Begriffe tatsächlich entweder identisch oder nur gleich sind. ___ qstnhdr ___ Warum hat "map (filter fst)" den Typ "[[(Bool, a)]] - [[(Bool, a)]]]"? ___ tag123type-interferenz ___ Typ-Inferenz ist der Prozess, bei dem automatisch Typen für Programme abgeleitet werden, wobei Regeln verwendet werden, die von einem Typsystem definiert werden. ___
1
Antwort

C ++ 11 Typ Rückschluss mit Lambda und Std :: Funktion

Ich habe das folgende Codeschnipsel, das, obwohl es ganz trivial ist, ein Muster darstellt, das ich in allgemeinerem Code verwenden möchte. %Vor% Ich möchte unary_apply mit Funktionszeigern, Funktoren, lambdas usw. aufrufen können: daher d...
05.07.2012, 12:10
1
Antwort

Die Einschränkung von Arrays.asList () ist nicht wahr in Thinking in Java 4th Edition [geschlossen]

In diesem Buch steht:    Eine Begrenzung von Arrays.asList () ist, dass es eine optimale Schätzung darstellt   der resultierende Typ der Liste und achtet nicht auf das, was Sie tun   weisen es zu. Das Buch ist Denken in Java Von Bruc...
10.03.2016, 07:20
2
Antworten

Können wir Variablenvariablen in der Konstruktorposition im Hindley-Milner-Typensystem haben?

In Haskell können wir den folgenden Datentyp schreiben: %Vor% Die Typvariable f hat die Art * -> * (d. h. es ist ein Konstruktor des unbekannten Typs). Daher hat Fix die Art (* -> *) -> * . Ich frage mich, ob Fix ein g...
06.05.2016, 04:38
3
Antworten

Generische Methoden und Typ-Inferenz in Java

Gegeben der folgende nicht sehr nützliche Code: %Vor% (Bitte korrigieren Sie mein Verständnis, wenn es falsch ist!) Der zweite Aufruf von fancy() ist ein Compilerfehler, da Java keinen gemeinsamen Typ zwischen den beiden Argumenten abl...
16.07.2012, 22:41
2
Antworten

Entwerfen einer praktischen Standardwertkarte in Scala

Ich benutze viele verschachtelte Maps, zB Map [Int, Map [String, Set [String]]], und ich möchte gerne neue Maps, Sets usw. automatisch erstellen, wenn ich auf a zugreife neuer Schlüssel. Z.B. etwas wie das Folgende: %Vor% Beachten Sie, dass...
06.07.2010, 15:01
2
Antworten

Generik-Typ-Inferenz schlägt fehl?

Beispiel A Studieren Sie das folgende Snippet: %Vor% Kann jemand erklären, warum Typinferenz für die Zuweisung zur lokalen Variablen p funktioniert, aber nicht für den zweiten tatsächlichen Parameter zu process ? Beispiel B Da...
10.11.2010, 22:41
1
Antwort

Abhängige Typen: Vorlagenargumentabzug fehlgeschlagen

In meinem Code verwende ich eine Template-Bildklasse Image<T> in Kombination mit std::shared_ptr . Diese Bildzeiger sollen an verschiedene Bildverarbeitungsfunktionen übergeben werden, von denen einige unabhängig vom Bildtyp sind. Bet...
21.07.2015, 13:49
2
Antworten

Methodentypinferenz in der Java-Spezifikation

Ich schreibe gerade einen Java-Compiler und habe Abschnitt 15.12.2.7 implementiert. von der JLS7 ( Ссылка ), eins der ärgerlichsten Abschnitte der Spezifikation. Ich habe immer noch ein Problem, da die Spezifikation irgendwie unterspezifiziert o...
21.05.2012, 19:01
4
Antworten

C # Generische Methodentypargument-Inferenz

Gibt es eine Möglichkeit, die Typdefinitionen hier zu verallgemeinern? Idealerweise würde ich gerne den Typ von 'testInput' ändern und den Test zum Kompilierungszeitpunkt korrekt ableiten können. %Vor% Aktualisierung: Ich kann den Typ der Fu...
13.05.2010, 06:45
3
Antworten

Der Compiler ruft keine geeignete generische Überladung auf, wenn er mit dem Werttyp übergeben wurde

Ich habe öffentliche Funktionen wie folgt: %Vor% Grundsätzlich möchte ich Referenztypen und NULL-Typen individuell behandeln. Es kompiliert; bis ich nach Werttypen rufe. Für Referenztypen wird kompiliert. %Vor% Was ist das für eine echt...
07.02.2013, 11:18