-allow-extension-for-bottom

Simon Peyton-Jones simonpj at microsoft.com
Mon Oct 11 11:35:30 EDT 2004


Ah I see.  You get earlier results, but the overall computation is
unchanged. 

Hmm.  I can't say I'm persuaded.  The transformation is unsound in
general and, because it makes programs lazier, it'll slow programs down
a bit; in exchange there's the possibility of earlier output (which may
or may not be visible in the ultimate result).

I think you are better off writing the program you want, rather than
relying on the compiler to find it for you!

Simon


| -----Original Message-----
| From: glasgow-haskell-users-bounces at haskell.org
[mailto:glasgow-haskell-users-
| bounces at haskell.org] On Behalf Of Serge D. Mechveliani
| Sent: 11 October 2004 13:32
| To: Simon Peyton-Jones
| Cc: glasgow-haskell-users at haskell.org
| Subject: Re: -allow-extension-for-bottom
| 
| First, thanks to the people who correct me about `equivalence',
| (I skip the name because the letter was addressed privately).
| 
| Because we do not mean to compile each program to the equivalent
| one of
|         error "bottom"
| 
| 
| On Mon, Oct 11, 2004 at 12:44:49PM +0100, Simon Peyton-Jones wrote:
| > Can you give a small program that runs 1000x faster in one form
compared
| > with the other?
| >
| > Currently, if foo is strict, GHC transforms (2) into (1), not the
other
| > way round. In general, transforming (1) into (2) looks hard, because
it
| > means finding the common portions of two expressions.
| 
| Anywhay, this looks like an appropriate business for a clever
| compliler (under some option).
| 
| > But I'd be
| > interested to see cases where you get a lot of performance from such
a
| > transformations.
| >
| > Simon
| >
| 
| 
| I my recent practical example, the program with the factored `if'
| prints out in 1 second a very useful information on the first
| `steps' of a certain proof (the last steps take long),
| while the unfactored version holds the whole result until 30 seconds.
| But this is on the toy example. In practice, this may be, say,
| 100 hours, because the prover is allowed and expected to think long.
| The simplified version of the program is
| 
|   main = hSetBuffering stdout NoBuffering >> putStr (out "\n")
| 
|   out :: String -> String
| 
|   out = let valueTakingLong =  last [1 .. (10^7)]  > 0
|         in
|         if  valueTakingLong  then  ('a' :) . ('b' :)
|         else                       ('a' :) . ('b' :)
| 
| The author intended 'a' to appear immediately.
| But it appears only after a long time.
| 
| This is hard to control such things in practice,
| one has to take effort to write the factored program.
| And usually, this is immaterial whether in  (if p x)
| (p x)  may yield bottom.
| 
| I suspect that
| (1) the example can be changed so that the full evaluation time
|     difference will be 1000 times
|     (somewhat apply `head' to the above `if' expression ...)
| 
| (2) this concerns not only the `if' factoring, this effects the
|     `bottom' treating in general.
| 
| What do you think of this?
| 
| -----------------
| Serge Mechveliani
| mechvel at botik.ru
| 
| 
| 
| > | -----Original Message-----
| > | From: glasgow-haskell-users-bounces at haskell.org
| > [mailto:glasgow-haskell-users-
| > | bounces at haskell.org] On Behalf Of Serge D. Mechveliani
| > | Sent: 11 October 2004 12:22
| > | To: haskell at haskell.org
| > | Cc: glasgow-haskell-users at haskell.org
| > | Subject: -allow-extension-for-bottom
| > |
| > | Dear Haskell implementors,
| > |
| > | Consider the compilation flag  -allow-extension-for-bottom
| > |
| > | which changes the language meaning so that allows to ignore
| > | the bottom value. For example, the programs
| > |
| > |    (1)   (\ x -> (if p x then  foo (g x)  else  foo (h x)) )
| > | and
| > |    (2)   (\ x -> foo ((if p x then  g x  else  h x)) )
| > |
| > | become equivalent, and many program transformations become
| > | possible.
| > | I suspect that after compiling and running of a program under
| > | -allow-extension-for-bottom  the user will discover many helpful
| > | information about the original program.
| > | For example, under  -allow-extension-for-bottom  it may run 1000
| > | times faster, and then, the user finds out what to change to have
| > | a 1000 times speed-up for the original program for the standard
| > | Haskell.
| > |
| > | Thus, in my particular practical example, it is evident to me that
| > | it is better to specify (2). But many similar effects are hard to
| > | find out without compiling under  -allow-extension-for-bottom.
| > |
| > | Maybe, the compiler could issue the warnings like, say,
| > |
| > |   "Consider factoring `if' in ...   This may improve ... "
| > | ?
| > |
| > | Copy, please, the answer to  mechvel at botik.ru,
| > |
| > | -----------------
| > | Serge Mechveliani
| > | mechvel at botik.ru
| > |
| > |
| > |
| > |
| > | _______________________________________________
| > | Glasgow-haskell-users mailing list
| > | Glasgow-haskell-users at haskell.org
| > | http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
| >
| _______________________________________________
| Glasgow-haskell-users mailing list
| Glasgow-haskell-users at haskell.org
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-users


More information about the Glasgow-haskell-users mailing list