werden von Haskell Keiner dieser beiden Punkte terrifically gut ausgebildet. Ich denke, Haskell führt immer noch zu einem etwas unkompilierten Code, aber nähert sich dem ganzen Problem sowohl mit einer anderen Philosophie als auch mit anderen Tools.
Queues
Grob Hickey darauf hin will, dass, wenn Sie eine Methode für ein Objekt zu schreiben, die
ein anderes Objekt aufruft
class Foo
def bar(baz)
baz.quux
end
end
dann haben wir nur den Begriff hartcodiert, dass Was immer in Foo#bar
übergeben wird, muss eine quux
Methode haben. Es ist eine Komplettierung in seiner Sicht, weil es bedeutet, dass die Implementierung Foo
von Natur aus an die Implementierung der Implementierung eines Objekts gebunden ist, das an Foo#bar
übergeben wird.
Dies ist weniger ein Problem in Ruby, wo Methodenaufruf eher wie eine dynamisch verteilte Nachricht zwischen Objekten gesendet wird. Es bedeutet einfach, dass ein Objekt, das an Foo#bar
übergeben wird, irgendwie verantwortlich antworten muss, wenn die quux
Nachricht gegeben wird, nicht viel mehr.
Aber es bedeutet Sequenzialität in der Nachrichtenbehandlung. Wenn Sie stattdessen die Nachricht in einer Warteschlange ablegen, um sie schließlich an das resultierende Objekt zu senden, können Sie problemlos einen Vermittler an dieser Naht platzieren. Vielleicht möchten Sie bar
und quux
gleichzeitig ausführen.
Mehr als Haskell, diese Idee wird in Erlang zu einem logischen Extrem gebracht und ich empfehle dringend zu lernen, wie Erlang diese Art von Problemen löst.
spawn(fun() -> Baz ! quux)
Regeln
Hickey betont immer wieder, dass insbesondere hartcodierte Methoden der complect Dinge Verzweigung zu tun. Um zu zeigen, genießt er keine Case-Anweisung oder Mustererkennung. Stattdessen schlägt er Regeln vor, von denen ich annehme, dass er "Produktionsregeln" -Systeme meint. Diese erzeugen Auswahl und Verzweigung, indem sie einem Programmierer erlauben, eine Reihe von Regeln für das "Auslösen" bestimmter Aktionen einzurichten und dann zu warten, bis eingehende Ereignisse ausreichende Regeln erfüllen, um das Auslösen von Aktionen auszulösen. Die bekannteste Implementierung dieser Ideen ist Prolog.
Haskell hat Muster tief in seine Seele gebaut Matching, so ist es schwer zu argumentieren, dass Haskell sofort auf diese Weise decomplects ... aber es ist ein wirklich gutes Beispiel für ein Regelsystem am Leben in Haskell- Typ-Klasse Auflösung .
wohl bekannteste Begriff hierfür ist mtl
-Stil typeclasses wo Sie Schreibfunktionen am Ende mit Signaturen wie
foo :: (MonadReader r m, MonadState s m, MonadIO m, MonadCatch m)
=> a -> m b
wo foo
m
so lange in der Art vollständig polymorph ist, wie es bestimmte folgt Zwänge-it muss einen konstanten Kontext haben r
, ein veränderbarer Kontext s
, die Fähigkeit, IO
auszuführen, und die Fähigkeit, Ausnahmen zu werfen und abzufangen.
Die tatsächliche Auflösung, welche Arten alle diese Bedingungen instanziieren, wird durch ein Regelsystem gelöst, das oft (liebevoll oder anderweitig) "type class prolog" genannt wird. In der Tat, es ist ein leistungsfähiges System genug, um ganze Programme innerhalb des Systemtyps zu kodieren.
Es ist wirklich wirklich nett und gibt Haskell eine Art natürlicher Abhängigkeit-Einspritzungsart, wie oben durch das mtl
Beispiel beschrieben wird.
Ich denke jedoch, dass die meisten Haskeller nach langem Gebrauch eines solchen Systems verstehen, dass, obwohl Regelsysteme manchmal schlau sind, sie auch leicht außer Kontrolle geraten können. Haskell hat eine Los von sorgfältigen Einschränkungen der Macht der Klasse Prolog Klasse, die sicherstellen, dass es für einen Programmierer einfach ist, vorherzusagen, wie es sich auflösen wird.
Und das ist ein primäres Problem mit Regelsystemen insgesamt: Sie verlieren die explizite Kontrolle darüber, welche Aktionen am Ende feuern ... so wird es schwieriger, Ihre Regeln zu massieren, um das Ergebnis zu erzielen, das Sie erwarten. Ich bin mir nicht wirklich sicher, dass ich Rich hier zustimme, dass Regelsysteme so zur Dekompression führen. Sie können nicht explizit Informationen abzweigen, die an andere Objekte gebunden sind, aber Sie richten viele unscharfe, weitreichende Abhängigkeiten zwischen den Dingen ein.
Wie passt Haskell oder Clojure dazu? –
@ ThomasM.DuBuisson Hickey's Vortrag basiert auf Paradigmen, die er für Clojure kreiert hat und was er von Haskell mochte. Hoffte auf Einsicht von der Seite der Gemeinschaft, die mit seinen Lehren arbeitet. – nitsujri
Sie implizieren Bedingungen aus Regeln, anstatt Bedingungen direkt zu schreiben. – Vektorweg