Sto pensando ai modi in cui utilizzare il sistema di tipi Haskell per rafforzare la modularità in un programma. Ad esempio, se ho un'applicazione web, sono curioso di sapere se esiste un modo per separare tutto il codice del database dal codice CGI dal codice del filesystem dal codice puro.Utilizzo del sistema di tipo Haskell per rafforzare la modularità
Per esempio, io sto immaginando una monade di DB, così ho potuto scrivere funzioni come:
countOfUsers :: DB Int
countOfUsers = select "count(*) from users"
vorrei che fosse impossibile usare gli effetti collaterali diversi da quelli supportati dalla monade di DB. Sto immaginando una monade di livello superiore che sarebbe limitata ai gestori di URL diretti e che sarebbe in grado di comporre chiamate alla monade DB e alla monade IO.
È possibile? È saggio?
Aggiornamento: ho finito per il raggiungimento di questo con la Scala, invece di Haskell: http://moreindirection.blogspot.com/2011/08/implicit-environment-pattern.html
Grazie, Don! La prima soluzione suona come quello che sto cercando. Conosci pacchetti specifici che utilizzano questa tecnica, o buoni termini per google ("monade IO limitato" non si è presentato molto)? – Bill
Un buon esempio del concetto "taint monad", http://blog.sigfpe.com/2007/04/trivial-monad.html –
Grazie. Se scelgo di utilizzare il modello "tainted monad" per la mia monade DB, cosa devo fare per estrarre i dati dalla monade DB? Il mio gestore di azioni HTTP deve utilizzare un trasformatore monad con DB in esso? – Bill