Alain Cremieux wrote:
Hi, I am writing a binding to GraphViz/AGraph. I've used C2HS (excellent tool) and everything has been working in a satisfying way so far. To test the usability of the binding, I translated a c program among the examples, to Haskell. And then, after some modifications, I began to hesitate : which Haskell functions should be made pure ? [...] So where do I have to put the limit, between actions (create graph, impure) and state queries (number of nodes), or between functions returning Bool/Int and others ?
State queries are not pure, as they depend on state, and state could change over time. Remember that, due to lazy evaluation, a pure functions can always be evaluated later than you expect. For every function in question, you need to ask yourself: Does the function always return the same value if you pass the same parameter? If no, it has to be in the IO monad. For example, if you have an action to change the object name, you can't have a pure function that gets the object name. If you have an action to free the graph (as opposed to using ForeignPtrs and the Garbage Collector to clean up after yourself), then you can't have any pure functions that operate on the graph; otherwise, the graph could already have been freed when the pure function is finally evaluated. I hope that helps a bit, Cheers, Wolfgang