structural-typing

___ qstnhdr ___ Warum hat Haskell keine Datensätze mit Strukturtypisierung? ___ qstntxt ___

Ich habe gehört, dass Haskell strukturelle Typisierung beschrieben hat. Aufzeichnungen sind eine Ausnahme, obwohl, wie ich es verstehe. Zum Beispiel kann %code% nicht mit etwas vom Typ %code% aufgerufen werden, obwohl %code% und %code% in ihren Feldern nur nominell unterschiedlich sind.

%Vor%

Gibt es eine Erklärung für die Ablehnung der Erweiterung der strukturellen Typisierung auf alles einschließlich Datensätze?

Gibt es statisch typisierte Sprachen mit Strukturtypisierung auch für Datensätze? Gibt es vielleicht eine Debatte darüber, über die ich im Allgemeinen für alle statisch getippten Sprachen lesen kann?

    
___ answer21096333 ___

Um Ihre letzte Frage zu beantworten, haben Go und Scalas definitiv strukturelle Typisierung. Einige Leute (einschließlich mir) würden das "statisch unsichere Typisierung" nennen, da es implizit alle gleich benannten Methoden in einem Programm mit der gleichen Semantik deklariert, was "gruselige Aktion auf Distanz" bedeutet, die Code in Quelldatei bezieht Code in einer Bibliothek, die das Programm noch nie gesehen hat.

IMO, besser zu verlangen, dass die gleichnamigen Methoden explizit erklären, dass sie einem benannten semantischen "Modell" des Verhaltens entsprechen.

Ja, der Compiler würde garantieren, dass die Methode aufrufbar ist, aber es ist nicht viel sicherer als zu sagen:

%Vor%

Und der Compiler darf eine beliebige Implementierung wählen, die %code% sein kann oder nicht.

(Eine ähnliche Idee kann mit Scala "implicits" oder Haskell (GHC?) "Reflection" Paket gemacht werden.)

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

Haskell-Aufzeichnungen sind nicht wirklich "weniger strukturell" als der Rest des Typsystems. Jeder Typ ist entweder vollständig spezifiziert oder "spezifisch vage" (d. H. Mit einer Typklasse definiert).

Um sowohl %code% als auch %code% bis %code% zuzulassen, haben Sie ein paar Optionen:

Algebraische Typen:

Hier definieren Sie %code% und %code% Datensätze, die beide Teil des Typs %code% sind:

%Vor%

(abwechselnd und vielleicht idiomatisch:)

%Vor%

Typklassen

Hier definieren Sie %code% als fähig, jeden Typ als Eingabe zu akzeptieren, solange eine typeclass-Instanz für diesen Typ geschrieben wurde:

%Vor%

Die Verwendung von typeclasses erlaubt Ihnen, weiter zu gehen als die normale strukturelle Typisierung - Sie können Typen akzeptieren, in die die notwendigen Informationen eingebettet sind, auch wenn die Typen nicht ähnlich aussehen, z. B .:

%Vor%

Wir können %code% (oder irgendeine andere Funktion) ausführen, um die benötigten Daten von dem zu erhalten, was wir haben!

    
___ tag123record ___ Ein Datensatz in der Programmierung ist ein Datentyp mit Bezeichnungen für den Zugriff auf Felder des Datensatzes. ___ answer21094436 ___

Ich kenne zwei Bibliotheksimplementierungen strukturierter Datensätze in Haskell:

HList ist älter und wird in einem ausgezeichneten Papier erklärt: Haskells übersehenes Objektsystem (kostenlos online, aber SO lässt mich nicht mehr Links hinzufügen)

Vinyl ist neuer und verwendet neue GHC-Funktionen. Es gibt mindestens eine Bibliothek, Vinyl-gl, die es benutzt.

Ich kann jedoch den Sprachentwurf Ihrer Frage nicht beantworten.

    
___ tag123Strukturtypisierung ___ Strukturelle Typisierung ist die Fähigkeit eines Typsystems, einen Typ basierend auf den darin enthaltenen Daten und nicht nach dem Namen eines Typs zu identifizieren. ___ answer21073407 ___

Haskell hat strukturierte Typen, aber keine strukturelle Typisierung, und das wird sich wahrscheinlich nicht ändern. *

Die Ablehnung, nominell verschiedene, aber strukturell ähnliche Typen als austauschbare Argumente zuzulassen, wird als Typsicherheit bezeichnet. Es ist eine gute Sache. Haskell hat sogar eine Newtype-Deklaration, um Typen bereitzustellen, die nur nominell verschieden sind, um mehr Typsicherheit durchzusetzen. Type Safety ist eine einfache Möglichkeit, Bugs frühzeitig zu erkennen, anstatt sie zur Laufzeit zuzulassen.

Zusätzlich zu amindfvs guter Antwort, die Ad-hoc-Polymorphismus über typeclasses (effektiv eine von einem Programmierer deklarierte Merkmaläquivalenz) enthält, gibt es parametrischen Polymorphismus, bei dem Sie absolut jeden Typ zulassen, also %code% erlaubt jeden Typ in Ihrer Liste und %code% erlaubt jeden Typ in Ihrem Binärbaum.

Dies gibt drei Antworten auf "sind diese Typen austauschbar?".

  1. Nein; Der Programmierer hat es nicht gesagt.
  2. Entspricht einem bestimmten Zweck, weil der Programmierer das gesagt hat.
  3. Es ist mir egal - ich kann dasselbe mit dieser Datensammlung machen, weil es keine Eigenschaft der Daten selbst verwendet.

Es gibt keinen 4: Compiler, der Programmierer außer Kraft setzt, weil sie zufällig ein paar Ints und einen String wie in dieser anderen Funktion benutzt haben.

* Ich sagte, Haskell wird sich wahrscheinlich nicht in strukturelle Typisierung verwandeln. Es gibt einige Diskussionen, um eine Form von erweiterbaren Datensätzen einzuführen, aber es ist nicht geplant, %code% als gleich %code% oder %code% als %code% zu zählen.

    
___
6
Antworten

Warum müssen Interfaces in Java deklariert werden?

Manchmal haben wir mehrere Klassen, die einige Methoden mit der gleichen Signatur haben, die aber keiner deklarierten Java-Schnittstelle entsprechen. Zum Beispiel haben sowohl JTextField als auch JButton (unter mehreren anderen in javax.s...
17.04.2011, 04:24
2
Antworten

Scala - wie definiert man einen Strukturtyp, der auf sich selbst verweist?

Ich versuche eine generische interpolate -Methode zu schreiben, die für jeden Typ mit zwei Methoden funktioniert, a * und + , wie folgt: %Vor% Das funktioniert zwar nicht (auf Scala 2.8.0.RC7), ich bekomme folgende Fehlermeldung: %...
08.07.2010, 07:48
1
Antwort

Strukturelle Subtyping-Reflexion

Können wir den Typ von val s: String mit Hilfe der Reflexion von der Außenseite der Funktion f ? erhalten %Vor%     
01.11.2012, 21:01
4
Antworten

Warum hat Haskell keine Datensätze mit Strukturtypisierung?

Ich habe gehört, dass Haskell strukturelle Typisierung beschrieben hat. Aufzeichnungen sind eine Ausnahme, obwohl, wie ich es verstehe. Zum Beispiel kann foo nicht mit etwas vom Typ HRec2 aufgerufen werden, obwohl HRec und HRec2 in i...
12.01.2014, 05:22