2009-09-21 14 views
9

Sto solo imparando Haskell e sto cercando di capire il modo più idiomatico per implementare un algoritmo di linea di vista.È meglio usare la monade di stato o passare lo stato in modo ricorsivo?

Il codice demo che ho trovato utilizza la monade di stato, ma mi sembra più semplice (sono solo un principiante) passare lo stato in modo ricorsivo. Cosa mi manca qui? Ci sono problemi di prestazioni?

codice Find a: http://www.finalcog.com/bresenham-algorithm-idiomatic-haskell

Grazie,

Chris.

+0

La ricorsione può essere più lenta e far crescere lo stack –

+7

@Tay La ricorsione può essere anche più veloce e può essere eseguita in uno spazio di stack costante. – Amok

+5

Vale la pena sottolineare che la monade di stato e la ST ("Discussione di stato", che il tuo articolo usa) non sono la stessa cosa. – jrockway

risposta

11

Può diventare un po 'prolisso passare lo stato ovunque. Inoltre, la monade di stato è ben conosciuta dalla maggior parte dei codificatori di haskell in modo che possano sapere cosa stai facendo. Se fai girare a mano il tuo, fuori da una monade, può essere difficile discernere cosa fa il tuo codice.

Trovo pulito lo stato per incapsulare i cambiamenti di stato, è piuttosto ovvio quale parte del codice è stateful (vale a dire altera o dipende dallo stato) w.r.t. il resto delle cose pure.

+1

Anche imparare a usare bene le Monade è importante, quindi usarle in una situazione in cui sai come realizzare la stessa cosa altrimenti può essere un buon modo per imparare. – Amok

10

Per i programmi più grandi, è meglio nascondere lo stato che passa al sistema idraulico nella monade. C'è meno rischio di errore allora.

3

Un vantaggio dell'utilizzo di una monade per passare lo stato piuttosto che passare allo stato esplicitamente, è che ci sono molti combinatori utili definiti per le monadi che è possibile utilizzare.

Problemi correlati