Mir ist klar, dass ich zu spät zur Party komme, aber Sie hatten hier zwei theoretische Antworten und ich wollte eine praktische Alternative zum Kauen bieten. Ich komme als ein verwandter Haskell Noob, der dennoch kürzlich für ein Projekt, an dem ich gerade arbeite, zwangsmarschiert wurde.
Erstens können Sie die meisten Probleme in Haskell produktiv lösen, ohne nach Pfeilen zu greifen. Einige bemerkenswerte Haskeller mögen und benutzen sie wirklich nicht (mehr dazu hier , hier und hier ). Wenn du also zu dir selbst sagst "Hey, ich brauche diese nicht", dann verstehe, dass du vielleicht wirklich richtig bist.
Was ich an Arrows am meisten frustrierte, als ich sie zum ersten Mal lernte, war, wie die Tutorials zu diesem Thema unweigerlich zur Analogie der Schaltkreise führten. Wenn Sie sich den Arrow-Code ansehen - zumindest die gezuckerte Sorte -, ähnelt er weniger einer Hardware-Definitionssprache. Ihre Eingänge sind rechts ausgerichtet, Ihre Ausgänge links. Wenn Sie nicht alle richtig verkabeln, werden sie einfach nicht ausgelöst. Ich dachte mir: Wirklich? Sind wir hier gelandet? Haben wir eine Sprache geschaffen, die so hoch ist, dass sie wieder aus Kupferdrähten und Lötzinn besteht?
Die richtige Antwort auf diese Frage lautet, soweit ich feststellen konnte: Ja. Der derzeitige Killer-Anwendungsfall für Arrows ist FRP (denken Sie an Yampa, Spiele, Musik und reaktive Systeme im Allgemeinen). Das Problem, mit dem FRP konfrontiert ist, ist im Wesentlichen dasselbe wie bei allen anderen synchronen Nachrichtenübermittlungssystemen: Wie kann ein kontinuierlicher Strom von Eingaben in einen kontinuierlichen Strom von Ausgaben verdrahtet werden, ohne relevante Informationen zu verlieren oder Leckagen auszulösen? Sie können die Streams als Listen modellieren - mehrere aktuelle FRP-Systeme verwenden diesen Ansatz -, aber wenn Sie viele Eingaben haben, ist die Verwaltung von Listen fast unmöglich. Sie müssen sich vom Strom isolieren.
Was Pfeile in FRP-Systemen erlauben, ist die Zusammensetzung von Funktionen in einem Netzwerk, während gleichzeitig jeglicher Verweis auf die zugrunde liegenden Werte, die von diesen Funktionen übergeben werden, vollständig abstrahiert wird. Wenn Sie noch nicht mit FP vertraut sind, kann dies zunächst verwirrend und dann überwältigend sein, wenn Sie die Auswirkungen aufgegriffen haben. Sie haben erst vor kurzem die Idee aufgegriffen, dass Funktionen abstrahiert werden können und wie man eine Liste [(*), (+), (-)]
als vom Typ versteht [(a -> a -> a)]
. Mit Pfeilen können Sie die Abstraktion eine Ebene weiter verschieben.
Diese zusätzliche Fähigkeit zu abstrahieren birgt ihre eigenen Gefahren. Zum einen kann es GHC in Eckfälle drängen, in denen es nicht weiß, was es von Ihren Typannahmen halten soll. Sie müssen bereit sein, auf der Typebene zu denken - dies ist eine hervorragende Gelegenheit, sich mit Arten und RankNTypes und anderen derartigen Themen vertraut zu machen.
Es gibt auch eine Reihe von Beispielen für "Stupid Arrow Stunts", bei denen der Programmierer nach einem Pfeilkombinator greift, nur weil er oder sie mit Tupeln einen ordentlichen Trick vorführen möchte. (Hier ist mein trivialer Beitrag zum Wahnsinn .) Sie können dieses Hot-Dogging einfach ignorieren, wenn Sie es in freier Wildbahn sehen.
HINWEIS: Wie ich oben erwähnt habe, bin ich ein relativer Neuling. Wenn ich oben falsche Vorstellungen verkündet habe, können Sie mich gerne korrigieren.