2015-03-06 4 views

Antwort

6

Es ist fehlerhaft, da es wie angegeben nicht auf Strukturen mit transparenten Komponenten angewendet werden kann. Zum Beispiel:

signature S = sig type t; type u = int end 
signature T = 
sig 
    structure A : S 
    structure B : S 
    sharing A = B 
end 

wäre bereits illegal, obwohl Sie natürlich erwarten, dass dies in Ordnung ist.

Die Geschichte hier ist, dass Struktur-Sharing in SML'90 eingeführt wurde, wo keine transparenten Komponenten vorhanden waren. Mit SML'97 wurden diese hinzugefügt. An diesem Punkt wurde das gesamte Geschäft mit Sharing-Einschränkungen etwas veraltet, weil sie (bis zu einem gewissen Grad) durch "where type" -Einschränkungen abgelöst wurden. So wurde die Semantik des Teilens stark vereinfacht und das Teilen von Strukturen von einem primitiven zu einem syntaktischen Zucker degradiert. Aber dieser Zucker wurde so definiert, dass er nur mit SML'90-Programmen funktioniert - was sinnvoll ist, wenn man ihn nur als Rückwärtskompatibilitäts-Hack betrachtet, aber nicht, wenn man die Struktur als zentrales Merkmal von SML'97 betrachtet.

Die Mitglieder der SML-Community sind sich über die Relevanz der Freigabe von Einschränkungen nicht einig. Manche halten sie für veraltet, andere für immer wichtig. Leider konnte SML'97 keine Einschränkung "where structure" hinzufügen, die das Struktur-Shairing richtig hätte ersetzen können.

+0

Danke, Andreas. Ich hatte gehofft, du würdest diese Frage beantworten :) Es macht jetzt Sinn. Ich habe auch Bob Harper geschrieben, um danach zu fragen, also füge ich seine Antwort in einer anderen Antwort hinzu. –

2

Andreas Rossbergs Antwort hat schon geklärt, aber ich habe vor Andreas Antwort Professor Harper geschrieben. Ich poste seine Antwort hier für die Neugierigen:

Es ist ein rein technisches Problem mit der Definition. In SML 90 gab es einen Begriff der Strukturteilung über die konstituierende Typ Sharing hinaus. In SML 97 wurde die Strukturfreigabe so geändert, dass sie sharing der Konstituenten-Typen bedeutet, aber die Formulierung ist falsch (es gibt mehrere Ersatzkandidaten, so unterscheiden sich Compiler in ihr Verhalten). Es ist sowieso eine dunkle Ecke, so in dem Schema von Dinge ist es sehr gering, aber der Fehler und die damit verbundenen Inkompatibilitäten machen es unbrauchbar.