Programmazione guidata da eventi in Haskell

5

Sono nuovo di Haskell, quindi questa è più una domanda concettuale di alto livello. Ho letto questo: link e ha questo:

run :: Domain -> [Event] -> IO ()

run dm [] = do
  events <- uiUpdate dm
  run dm events

run _ (EventExit:_) =
  return ()

run dm (e:es) =
  run (dmUpdate dm e) es

Quindi uiUpdate genererebbe "eventi" in questo caso.

Sto cercando di capire come funziona in un'applicazione in cui è necessario spingere gli eventi. Un esempio: diciamo che hai una GUI in cui hai un contatore int singolo e tre tipi di fonti di eventi:

  • Filesystem
  • Rete
  • Interazione umana

Per semplicità, diciamo che il contatore deve essere aumentato o diminuito ogni volta che accade un qualsiasi tipo di evento (ad es. nuovo file aggiunto o cancellato, chiamata HTTP riuscita o fallita, umano digitato su una tastiera o cliccato con un mouse).

Come si spinge questi eventi nel ciclo degli eventi? Soprattutto, non sto chiedendo "ecco come puoi farlo", ma "ecco come funzionano le applicazioni Haskell del mondo reale". Soprattutto se ci sono diverse opzioni che vengono utilizzate nella pratica.

    
posta levant pied 21.04.2016 - 17:46
fonte

2 risposte

0

In un'applicazione Realworld, sei in balia di qualsiasi sistema di eventi che stai utilizzando. Normalmente, la libreria GUI fornisce il ciclo degli eventi. Quindi chiami semplicemente nell'API per generare l'evento e non c'è differenza con nessuna chiamata API.

Ad esempio in questo tutorial su Gtk, puoi inviare un evento nel pulsante callback. link Oppure puoi aggiungere una richiamata usando l'API Gtk che cattura tutti gli eventi.

Se stai costruendo il tuo sistema da zero con più thread, devi solo progettare il tuo ciclo degli eventi per includere funzioni per aggiungere eventi. Sarà uguale a qualsiasi altra lingua o paradigma; usi un mutex e blocca qualcosa, quindi invia l'evento a tutti gli eventi. Non puoi davvero riempire l'immagine senza sapere molto di più; devi entrare nelle erbacce ed effettivamente implementare qualcosa, perché non esiste un unico modo per farlo, e un ciclo di eventi è più un'idea che una cosa. È solo una funzione che osserva i suoi argomenti e chiama altre funzioni usando i callback.

L'esempio di Gtk è probabilmente il più "reale", perché nel mondo reale stai utilizzando una libreria GUI imperativa che mantiene (almeno una copia) la maggior parte dello stato della tua applicazione.

    
risposta data 02.01.2019 - 21:52
fonte
0

Supponiamo che tu abbia implementazioni di ciascuna delle tue tre fonti, updateUi , updateFS e updateNet , e supponiamo inoltre che siano tutte di tipo () -> IO [Event] . Per riunirli tutti in una lista puoi solo concat il risultato di ogni

updateAll :: () -> IO [Event]
updateAll = do
  uis <- updateUi
  fss <- updateFs
  nets <- updateNet
  concat [uis, fss, nets]
    
risposta data 02.01.2019 - 22:34
fonte

Leggi altre domande sui tag