
Dmitry Olshansky wrote:
There are some type-level boolean operation (If, &&, ||, Not) in Data.Type.Bool. Are they lazy enough?
I faced with problem and it seems that the reason is non-lazy "If". I.e. both (on-True and on-False) types are trying to be calculated. Does it work in this way really? Could it be changed?
Just a remark: if (type-level) computations are pure, then whether they are done lazily or in any other way should not matter. The evaluation strategy invariance is the main characteristic, if not the definition, of purity. Type-level computations are not pure however: they may have an effect of divergence, or generating a type-error. Thus we really need a type-level If, which evaluates only one of the two conditional branches but never both. It can be easily implemented using the standard approach of delaying evaluation with a thunk. Please see http://okmij.org/ftp/Haskell/TTypeable/TTypeable.hs and search for ORELSE (near the end of the file). See http://okmij.org/ftp/Haskell/typeEQ.html#TTypeable for background.