Limiting resources on a per-function basis?

Alastair Reid alastair at reid-consulting-uk.ltd.uk
Fri Jan 2 16:33:25 EST 2004


> I would really like to be able to set resource limits on a per-function
> basis.  I am envisioning something like:
>
> limit :: l -> (a -> b) -> (a -> Maybe b)
> limit lim fn = ...
>
> which would convert a function so that it returns Nothing if a limit
> (on stack, heap, time, etc.) is exceeded during evaluation of that
> function.  Is there any hope of being able to do this within the
> existing GHC libraries?

This is tricky in a lazy language for two reasons:

1) Suppose the function returns '(42,37)', what do you want
   the limit to be applied to?

   a) Computing the whole result.
   b) Computing '(42,?)' (i.e., not evaluating the 2nd field)
   c) Computing '(?,37)' (i.e., not evaluating the 1st field)
   d) Computing '(?,?)' (i.e., not evaluating either field)

2) Suppose the value being evaluated depends on a shared
   result, should you include that cost in the result?

   For example, if you have:

     primes :: [Int]
     primes = ... 

     getPrime :: Int -> Int
     getPrime n = primes !! n

   should all calls to 'limit 10 getPrime 100' return the same
   result even though the first call is vastly more expensive
   than the subsequent calls.

There are also some semantic issues like retaining referential
 transparency but the details depend a bit on the answers to the
 above questions.

Some of the semantic issues can be addressed using non-deterministic 
exceptions.  (For the most part, this involves putting 'limit' in the IO 
monad.)

> If not, is it even possible to determine after-the-fact how much
> stack or heap space a function evaluation required?

GHC's profiling tools can give information of this sort.
I don't think there's a way to access this information at
runtime but it should be possible to implement and might
even be straightforward?

--
Alastair Reid     www.haskell-consulting.com



More information about the Haskell-Cafe mailing list