[Haskell-cafe] GHC predictability

Paul Johnson paul at cogito.org.uk
Tue May 13 14:48:18 EDT 2008


Jeff Polakow wrote:
> [...] This can be easily fixed by defining a suitable strict sum:
>
>     sum' = foldl' (+) 0
>
> and now sum' has constant space. We could try to redefine mean using 
> sum':
>
>     mean1 xs = sum' xs / fromIntegral (length xs)
>
> but this still gobbles up memory. The reason is that xs is used twice 
> and cannot be discarded as it is generated. 
As an experiment I tried using "pointfree" to see if it would do 
something similar.

 > $ pointfree "\xs -> foldl' (+) 0 xs / fromIntegral (length xs)"
 > ap ((/) . foldl' (+) 0) (fromIntegral . length)

But when I try this in GHCi 6.8.2 I get:

 > Prelude Data.List Control.Monad> let mean2 = ap ((/) . foldl' (+) 0) 
(fromIntegral . length)
 >
 > <interactive>:1:12:
 >    No instance for (Monad ((->) [b]))
 >       arising from a use of `ap' at <interactive>:1:12-58
 >     Possible fix: add an instance declaration for (Monad ((->) [b]))
 >    In the expression: ap ((/) . foldl' (+) 0) (fromIntegral . length)
 >    In the definition of `mean2':
 >        mean2 = ap ((/) . foldl' (+) 0) (fromIntegral . length)


Any ideas?  Would the auto-generated pointfree version be any better if 
it could be made to work?

Paul.


More information about the Haskell-Cafe mailing list