
I'd like to write reasonable Haskell interfaces to a few external libraries. To be specific -- all of them do limited calculations (no I/O) but each has an internal state. I know that I can have results dump everything into the IO monad, but I'd like to avoid the "sin bin" (I think it was Phil Wadler who called it that). To be specific, I have in mind the library pari ( http://en.wikipedia.org/wiki/PARI/GP ) which does symbolic algebra calculations. The way that the pari state works is that state of works is that we can add definitions of new quantities, and bind them to a calculated value. As part of the state there might be certain cached calculations. If I avoid deleting bound objects, it seems to me that it would be perfectly valid to make the interface into a monad have a complicated state which is being managed by the pari library. As long as any queries from pari give the same value (which should be the case if I never delete anything) then it should be valid without dumping things into the IO monad. Does anyone see anything wrong with my reasoning? Victor