Solution to ACM Asia Regional at Shanghai, 2000, Problem F: Hot or Cold? > import ReaderMonad > import Numeric(showFFloat) Represent a polynomial by the list of its coefficients as in the problem statement (i.e., higher power term comes first). Evaluate a polynomial at x with Horner's rule: > eval :: [Double] -> Double -> Double > eval p x = foldl1 (\a b -> a * x + b) p Integrate a polynomial symbolically: > integrate :: [Double] -> [Double] > integrate p = zipWith (/) p [fromIntegral (n+1-i) | i<-[0..n]] ++ [0] > where n = length p - 1 Now we can solve the problem. (Hopefully this is still numerically stable.) > mean :: [Double] -> Double -> Double -> Double > mean p s e = (eval q e - eval q s) / (e - s) > where q = integrate p > main = do n <- readLn > if n==0 then return () > else do p <- rreadLn (readp n) > (s,e) <- rreadLn readse > putStrLn (showFFloat (Just 3) (mean p s e) "") > main > readp n = sequence (replicate (n+1) reader) > readse :: Reader (Double, Double) > readse = do s <- reader > e <- reader > return (s,e)