Sto provando a convertire il seguente codice imperativo stato in Haskell.Ciclo di stato con diversi tipi di interruzioni
while (true) {
while (get()) {
if (put1()) {
failImmediately();
}
}
if (put2()) {
succeedImmediately();
}
}
Sia il put1
e put2
leggere lo stato del sistema e modificarlo. get
può per semplicità solo leggere lo stato. failImmediately
dovrebbe uscire dal ciclo infinito e presentare un tipo di risultato, succeedImmediately
dovrebbe scoppiare ma presentare un risultato diverso.
Quello che ho cercato di usare era State Env Result
dove Env
rappresentavano lo stato dell'ambiente e Result
era qualcosa come Either Failure Success
per un po 'personalizzato Failure
e Success
.
Lotto con il requisito che l'intera espressione risultante dovrebbe collassare nel Failure
/Success
una volta che uno di essi viene prodotto (rompendo il ciclo) e altrimenti continua ad andare.
Un'idea che avevo era uso Either Exit()
dove data Exit = Success | Failure
e utilizzare StateT
in qualche modo di comportarsi sul Left
del Either
come se Either
stata la monade essere incatenato, cioè ignorando eventuali azioni successive.
Apprezzerei molto qualsiasi ispirazione o esempio di codice haskell che avrebbe lo stesso comportamento dello snippet precedente.
Modifica: versione perfezionata spostata in una domanda separata "Stateful computation with different types of short-circuit (Maybe, Either)".
si dovrebbe guardare in [ 'EitherT (Stato Env Risultato)'] (https://hackage.haskell.org/package/either-4.4.1/docs/Control-M onad-Trans-Either.html). Fammi sapere se quel suggerimento non è sufficiente e hai bisogno di ulteriori dettagli :) – Cactus
Ho la sensazione che questo potrebbe essere quello di cui ho bisogno, tranne che non ho la minima idea di come usarlo in questo scenario :(. Se vuoi essere così gentile da elaborare sarei sempre così grato – jakubdaniel