Sfondo
Vado attraverso John Hughes' Programming with Arrows, e ho sentito che avevo tutto dritto nella mia testa fino a quando il seguente esempio di utilizzo MAPA:In che modo mapA funziona con una freccia della funzione di flusso in Haskell?
>runSF (mapA (delay 0)) [[1,2,3],[4,5,6],[7,8,9]]
[[0,0,0],[1,2,3],[4,5,6]]
Dove runSF estrae la funzione di corrente dalla freccia funzione di corrente definita come:
newtype SF a b = SF {runSF :: [a]->[b]}
e il ritardo è definito come:
delay x = SF (init . (x:))
SF è un'istanza di ArrowChoice (che dichiara mapA) e quindi un'istanza di Arrow.
mia comprensione
mapA :: arr a b -> arr [a] [b]
delay :: SF a b
tale che delay
antepone semplicemente il suo secondo argomento con il suo primo.
Così, mapA (delay 0)
dovrebbe restituirci una freccia SF che prende [[a]]
e restituisce [[b]]
mapA (delay 0) :: SF [[a]] [[b]]
mi aspetterei che il "circuito" che questo si tradurrebbe in è:
Dove i numeri indicano parti del processo:
- Per qualsiasi valore non vuoto
list x
,listcase
emetteràRight(x, xs)
. Per la lista vuota,listcase
emetteràLeft()
, la custodia del terminale. - I valori codificati
Right
verranno passati alla parte inferiore. I valori taggatiLeft
verranno passati aconst[]
, che in sostanza interrompe l'iterazione. - Con ingresso
(x, xs)
, saranno passatix
a(delay 0)
, mentrexs
sarà passato indietro attraversolistcase
. - L'output di 3 sarà
(z, zs)
, che viene passato auncurry (:)
, che unisce la tupla alla lista.
Ecco la mia comprensione del flusso, con il contributo [[1,2,3],[4,5,6],[7,8,9]]
:
primo passaggio
Right ([1,2,3],[[4,5,6],[7,8,9]])
([1,2,3], [[4,5,6],[7,8,9]])
viene passato alla parte inferiore(delay 0)
è chiamato a[1,2,3]
, res ulting in[0,1,2]
.[[4,5,6],[7,8,9]]
viene passato allistcase
Secondo passaggio
Right ([4,5,6], [[7,8,9]])
([4,5,6], [[7,8,9]])
viene passata alla porzione inferiore(delay 0)
è invitato[4,5,6]
, con conseguente[0,4,5]
.[[7,8,9]]
viene passato allistcase
Terzo passaggio
Right ([7,8,9], [])
([7,8,9], [])
viene passata alla porzione inferiore(delay 0)
è invitato[7,8,9]
, con conseguente[0,7,8]
.[]
è passato alistcase
.
quarto passaggio
Left()
, caduto sul pavimento.
A questo punto, si arriva a parte 4, che prende l'uscita 3 e concats tutto insieme. Noi costruiamo essenzialmente di un'operazione di:
[0,1,2] : [[0,4,5] : [[0,7,8] : []]]
Il che ci [[0,1,2],[0,4,5],[0,7,8]]
darebbe.
mia confusione
Chiaramente, il mio flusso sopra è sbagliato.
Come si chiama runSF (mapA (delay 0)) [[1,2,3],[4,5,6],[7,8,9]]
in [[0,0,0],[1,2,3],[4,5,6]]
?
Beh, chiaramente la mia comprensione è disattivata dal momento che il tipo di ritardo è SF. Non una funzione in sé. – aftertommy