To my | Here is some strange question: | how to force the compiler to evaluate some things more statically | and to convert some run-time errors into the compile-time ones? Simon Peyton-Jones <[EMAIL PROTECTED]> writes > Not strange at all. It would be quite reasonable to have some way > to tell the compiler 'evaluate this to a static value'. I'd suggest > doing it via a pseudo-function > static :: a -> a > > which behaved like the identity function, except that it evaluated > its argument rather eagerly at compile time. Implementing it would > be a little delicate (because inlining is already a delicate part of > GHC) but would not take much code. Maybe, it requires some degree parameter d :: Int, how "far" to search. If the static computation of `static d f' in this degree fails, it is replaced with `f'. And probably, this should be a standard pragma {-# static d ... #-} ? > About converting run-time to compile-time errors, as others have > said, some functions are legitimately bottom. If I am not missing the subject, setting {-# static ..#-} or some special construct, the programmer re-defines deliberately what is legitimate. > But think about assertions: > > f x = assert (p x) (...x...) > > where assert :: Bool -> a -> a > Why at all `assert' is needed when there exists `if': f x = if p x then (...x...) else what-the-user-likes - ? In any case, `static' combined with (if .. error) or with `assert' may fit the aim. Marc van Dongen <[EMAIL PROTECTED]> writes D> .. Also I would like a D> assertAndBelieveMe which could be used to as in: D> D> quot' a b | assertAndBelieveMe (b /= 0) = quot a b D> D> So that a special version of quot could be used D> which would not check for b == 0. This looks like some different task for the compiler. Looks like a request for specializing any function f x y .. to the argument satisfying (c' x y ..) `quot' or any other function, may contain its "conditions" c1 x, c2 y ... which it may find in the way of computation. Should we care only of the condition x == a, x /= a ? The generic setting is "compute (f x y ..), provided (c' x y ..)" That is specialize f to the argument satisfying the condition. Now, the compiler has, for example, to guess, how c' relates to c1 the function f contains. Looks difficult ... The programmer could point explicitly: "... provided this precisely c1 x in f is True". But for this, the programmer has to know the source of f and refer to its parts. ------------------ Sergey Mechveliani [EMAIL PROTECTED]