On Wed, 27 Aug 2008, Jason Dagit wrote: > Ganesh was helping me with it and he recomended making it a ReaderT so > that the Repository is hiding inside. In the refactoring I've done so > far, I didn't take advantage of that, but in principle it should work. > It almost seems like we could just throw away RepoInState and replace it > with Repository p. In fact, that's probably what I should do. But, > then how do you declare IORepo in a way that allows (>>>=) to have the > right type?
> Oh right, so here was the problem. We don't want to use State because > you could fetch a previous state and use it later. But, we wanted to > store the (Repository p), so a Reader works for storing (Repository p) > since that part doesn't change. That's why we farmed out the part that > can change to the type RepoInState. I think not storing the Repository > in a Reader still presents the same issue of needing RepoInState. I > think without RepoInState we need all the permutations of type changes > implemented as functions which is yucky :( Right, so the idea is that Repository p can never change (either in value or type), because it's just a handle to the actual repository - akin to an IORef - whereas the changing type of RepoInState is responsible for tracking what we have actually done to the repo. That's why Repository p is in the reader part, whereas RepoInState is part of the "typed state". The point of having Repository p in the monad at all is so that callers can't suddenly pass in a different repository in the middle of a sequence of operations; lowerIORepo (which should also take a Reader p as a parameter) is also unsafe, but the series of operations done by the IORepo computation you pass to it are not unsafe (as long as the implementations of the low-level operations are correct). RepoInState could actually be an empty data decl (using a long-established GHC extension) since it is a phantom type parameter. Cheers, Ganesh _______________________________________________ darcs-users mailing list [email protected] http://lists.osuosl.org/mailman/listinfo/darcs-users
