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. ___
3
Antworten

Generics: Warum kann der Compiler in diesem Fall nicht die Typargumente ableiten?

Ich wollte eine Extension-Methode schreiben, die auf Wörterbüchern funktioniert, deren Werte eine Art Sequenz sind. Leider kann der Compiler die generischen Argumente aus meiner Verwendung der Methode nicht abzuleiten scheinen; Ich muss sie expl...
19.10.2010, 13:27
4
Antworten

Satzart Inferenz

Im folgenden Codefragment %Vor% Die Zeile mit dem Kommentar wird nicht kompiliert. Aus irgendeinem Grund kann der Typüberprüfer nicht herausfinden, dass der Typ für p1 myrec1 sein sollte. Liegt es daran, dass dieser Fall der Typinferenz einf...
04.04.2013, 13:25
3
Antworten

Warum erkennt Var in der XmlNodeList-Schleife das Objekt type und nicht XmlNode?

Wenn man eine XmlNodeList wie folgt durchläuft %Vor% alles funktioniert wie erwartet - foo ist eindeutig vom Typ XmlNode und die VS.NET IDE zeigt Methoden und Felder. Auf der anderen Seite %Vor% kompiliert nicht, weil hier foo vom T...
03.02.2012, 10:28
2
Antworten

Ist diese Haskell-Inferenz in Aktion oder etwas anderes?

Ich arbeite über das Online-Buch LYAH (der Link führt Sie direkt zu der Abschnitt, der meine Frage betrifft). Der Autor definiert einen Binärbaumdatentyp und zeigt an, wie eine Instanz des Typs Faltbar (definiert in Data.Foldable) durch Imp...
08.09.2011, 01:31
3
Antworten

Warum kompiliert dieses Java 8-Stream-Beispiel nicht?

Ich versuche herauszufinden, warum dieser Code nicht auf JDK 1.8.0_45 kompiliert: %Vor% Das Hinzufügen eines scheinbar unnötigen Cast korrigiert es: %Vor% Hier ist der Fehler vom Compiler: %Vor% Aus irgendeinem Grund wird der Rück...
02.06.2015, 14:55
2
Antworten

Warum ist eine Kontextreduktion notwendig?

Ich habe gerade dieses Papier gelesen ("Type classes: a exploration of der Design Space "von Peyton Jones & Jones, der einige Herausforderungen mit dem frühen Typenklassensystem von Haskell erklärt, und wie man es verbessern kann. Viele der...
01.02.2016, 18:27
4
Antworten

Typen in Haskell

Ich bin irgendwie neu in Haskell und ich habe Schwierigkeiten zu verstehen, wie abgeleitete Typen und solche Arbeiten. %Vor% Was genau bedeutet das? %Vor% Was sind die Unterschiede zwischen diesen? Und der abgeleitete Typ von foldr...
11.05.2010, 18:41
5
Antworten

Gibt es eine Möglichkeit, eine Teilmenge von Typparametern in Scala anzugeben, um den Rest abzuleiten?

Ich habe eine Klasse, die so aussieht: %Vor% A, B und C können abgeleitet werden, also kann ich es einfach mit: instanziieren %Vor% was mir ein X gibt [Nothing, Int, Int] - oft was ich will. Ich möchte aber manchmal angeben, dass A et...
01.03.2013, 11:56
1
Antwort

Wie entscheidet C ++ 11 über Inferenz zwischen Floats oder Doubles?

Betrachten Sie dieses Beispiel der Typinferenz: %Vor% Wird dieses Verhalten unter einem C ++ 11-Typ-Inferenzwert auf einen Float oder einen Doppelpunkt überprüft ?, kann dieses Verhalten gesteuert werden?     
23.09.2012, 14:54
1
Antwort

F # Möglichkeiten zum Eintippen der Inferenz?

In Expert F # 2.0 von Don Syme, Adam Granicz und Antonio Cisternino, pg. 44    Inferenz eingeben: Mit der | & gt; Der Operator lässt den Informationsfluss von eingeben   Eingabe von Objekten in die Funktionen, die diese Objekte manipulieren...
11.12.2012, 13:50