Hi Bulat, Bulat Ziganshin wrote:
Hello Ch.,
Monday, January 02, 2006, 9:36:03 PM, you wrote:
CAH> maybe you misunderstood me. Take the example of the ST monad. If you are
i feel that it will be clearer if you will compare Q with IO monad
the comparison doesn't work with the IO monad because the user runs the Q monad every time when splicing a generated expression. In contrast, the user can't run the IO monad out of a functional non-monadic expression, except when making use of unsafe features. Concerning the ST monad (for simplicity, consider one defined by the user without local type quantification) it is possible, in principle, to join the states of two ST runs overlapping in time, if you have a concept of what you would like to achieve, may depend on the application. Tomasz mentioned an important point: the monad laws for return. As long as they are respected by the quasi quote implementation, a return cannot destroy monadic information in the scope where the splice is inserted, so it is safe to turn an Exp into a (Q Exp) just be using return. How to generate the names inside this Exp is the job of the user, at the point where the spliced expression was created there should be a Q monad available with an appropriate name generation history. As long as the expression to be spliced is taken from the same scope, and this is the case in simple examples, there is no problem because the expression need not be passed as a parameter but can just be cited, even across quotation brackets due to cross-stage persistence. However, I think, with Tomasz remark we should not worry further about that point. -- Christoph