Mi piace pensare a Arrow
s come grafici aciclici diretti componibili. Ad esempio, una freccia di tipo:
SomeArrow (a, b, c) (d, e, f)
... si può pensare come un grafico che ha tre archi entranti di tipo a
, b
e c
e tre archi uscenti di tipo d
, e
e f
.
Utilizzando questa interpretazione, le operazioni di composizione di categoria per Arrow
s sono come concatenazione orizzontale per i grafici, che collega i bordi insieme:
(.) :: SomeArrow b c -> SomeArrow a b -> Some Arrow a c
... dove a
, b
e c
possono essere essi stessi tuple. Analogamente, id
è solo il grafico identità che inoltra tutte archi entranti per archi uscenti:
id :: SomeArrow a a
L'altra operazione chiave è (***)
che è come concatenazione verticale dei grafici:
(***) :: Arrow a b -> Arrow c d -> Arrow (a, c) (b, d)
si può pensare che come mettere due grafici fianco a fianco, combinando i loro bordi di input e i bordi di output.
Quindi Arrow
si verificano comunemente quando si lavora con grafici aciclici diretti digitati. Tuttavia, il motivo per cui di solito non li vedi spesso perché la maggior parte delle persone associa mentalmente i grafici a strutture di dati non tipizzate e ad alte prestazioni.
fonte
2014-04-05 02:02:00
[Relevant] (http: //programmers.stackexchange.it/questions/114681/what-is-the-purpose-of-arrows) – bheklilr
Può qualificare FRP basato su frecce? –
La mia comprensione di Frecce in Haskell è che più o meno ti danno il linguaggio dei circuiti, in cui un componente dipende dalle uscite del precedente. Potresti chiedere come questo sia diverso dalla normale composizione e combinazione di funzioni, ma le normali funzioni non possono portare con sé contesti e strutture extra, mentre le frecce sono più astratte e possono. Questo è il motivo per cui sono molto popolari in FRP, è possibile scrivere codice efficace che sembra puro e può essere ragionato molto facilmente. Vengono anche utilizzati nella libreria Hxt per lo streaming di dati XML tramite calcoli apparentemente puri. – bheklilr