Prima di tutto un disclaimer, potrei aver frainteso completamente il modo in cui threepenny-gui funziona a causa della mia non così avanzata conoscenza di Haskell, quindi prendi le mie asserzioni con un pizzico di sale. :-)Perché alcuni dei combinatori di FRP a tre pence-gui funzionano su una monade MonadIO invece di essere puri?
Mi sembra che alcuni combinatori non siano puri per es.
stepper :: MonadIO m => a -> Event a -> m (Behavior a)
Is stepper necessariamente operano su un certo tipo di IO monade (e non è quindi pura), o che sto mi fraintendere qualcosa qui? Seconda domanda, se quei combinatori sono davvero impuri, perché è così? Per me questo rende il codice per la costruzione del grafo degli eventi molto meno bello della banana reattiva, dal momento che si deve usare una monade IO invece di essere semplicemente semplici funzioni. Il codice sembra solo diventare più complicato allora in banana reattiva.
Ancora più spaventoso, valueChange sembra essere puro dal tipo
valueChange :: Element -> Event String
ma in realtà usando unsafeMapIO dentro, così è effettivamente facendo nascosta IO? Ancora una volta, potrei fraintendere qualcosa, ma non è questo il peccato più grave in Haskell? Era anche confuso, non potevo dire dal tipo come stava avvenendo la registrazione di richiamata ... questo non mi è mai successo prima in Haskell ... Questo è stato fatto per risparmiare agli utenti che hanno a che fare con la monade Frameworks?
In pratica significa che se voglio fare qualcosa con il comportamento restituito da stepper devo prima "scartarlo" dalla monade IO, cioè usare >> =, fmap o notazione. Questo rende il codice molto più complicato di quanto avviene nel caso di banana reattiva in cui il grafico degli eventi non viene costruito utilizzando una Monad (la rete di eventi è costruita utilizzando la monade Frameworks, ma è per la registrazione di inserimenti, una cosa diversa). –
La mia comprensione della monade IO è che esiste per garantire la trasparenza referenziale. Fintanto che tutto ciò che accade dentro la monade IO viene mantenuta la trasparenza referenziale di tutte le funzioni. La trasparenza referenziale è ancora mantenuta in pratica quando si usano funzioni come valueChange? –
@ miguel.negrao: Sì, Heinrich avrà scritto questa funzione con molta attenzione, in modo da mantenere la trasparenza referenziale. –