Ich habe eine EDSL die Liste artige combinators für Arrays bietet (map
, zipWith
, etc ..)Verhindern beobachtbaren Freigabe für bestimmte Teilbäume in Haskell
Einige combinators erfordern bestimmte Eingaben Direktzugriff sein. Z.B. das Datenfeld von Gather
die Elemente von Datenarray an den Indizes von der anderen angegebenen Picking: macht
Gather (Manifest [10,11,12]) (Manifest [2,0,0,1,2]) = [12,10,10,11,12]
Die Sprache für die Rückgewinnung Sharing Verwendung von data-reify
Paket. Das Problem besteht darin, dass manchmal der gleiche Teilbaum sowohl Knoten enthält, die einen wahlfreien Zugriff ermöglichen, als auch solche, die sequentiell berechnet werden können. Wenn sie geteilt werden, bricht der nachfolgende Evaluator.
Zum Beispiel im Baum unter ich für [1,2,3]
möchte geteilt halten werden, aber die Manifests
Umwickeln sie verschiedene Knoten in der wiedergewonnenen Graph zu sein:
[1, 2, 3]
/ \
Manifest Manifest
| |
| Map (+1)
\ /
Gather
Ein komplexeres Beispiel eine Reihe umfassen kann gemeinsame Knoten von denen alle sollten verschieden sein (obwohl Map (+1) (Manifest [1,2,3])
geteilt werden könnte.
[1, 2, 3]
/ \
Manifest Manifest
| |
Map (+1) Map (+1)
| /|
Map (*2)/|
\ /|
Gather |
\ |
ZipWith (+)
auch wenn ich eine Lösung für den einfachen Fall (Gather
Referenzenfindendirekt), deckt es bereits die meisten Anwendungsfälle ab.
Alle Zeiger sind willkommen!
Unten ist ein einfaches Modell der Sprache.
module NoSharing where
data AST = Manifest [Int]
| Map (Int -> Int) AST
| ZipWith (Int -> Int -> Int) AST AST
| Gather AST --^Data
AST --^Indices
complex = ZipWith (+) gathered indexes
where
gathered = Gather (Map (*2) indexes) indexes
indexes = Map (+1) $ Manifest [1,2,3]
simple = Gather dat indexes
where
dat = Manifest [1,2,3]
indexes = Map (+1) dat
Können Sie die Dinge identifizieren, die vom Konstruktor nicht geteilt werden sollten, z. Alle 'Manifeste' sollten nicht geteilt werden? –
Alles, was sich auf beobachtbares Teilen stützt, ist zwangsläufig fragil, weil Haskell kein beobachtbares Teilen hat. Bei einigen Implementierungen können Sie einige der Freigaben durch schmutzige Tricks wiederherstellen. Wenn Sie möchten, dass es zuverlässig ist, müssen Sie die Freigabe explizit in der DSL vornehmen. – augustss
@augustss Das beobachtbare Teilen kann falsche Negative, nicht False Positives ergeben, so dass es nichts bricht. Das Programm wird nur langsamer laufen. Es schien, als wäre es am einfachsten zu implementieren.Ich bin vielleicht immer noch in der Lage, implizites Teilen auf die reine Art und Weise wiederherzustellen, da die Begriffe strukturell verglichen werden können. – roldugin