On 01/08/2011 14:15, Simon Peyton-Jones wrote:
It's all regrettably delicate, but I think the simplest thing to do is to write 
integer-simple using either case expressions direct, or function definitions 
that trivially desugar into case expressions.  Ie not this:

xorDigits None          (!ds)         = ds
xorDigits (!ds)         None          = ds
xorDigits (Some w1 ds1) (Some w2 ds2) = Some (w1 `xor#` w2) (xorDigits ds1 ds2)

but rather

xorDigits None          None = None
xorDigits None ds@(Some _) = ds
xorDigits ds@(Some _) None = ds
xorDigits (Some ..) (Some..) = as before


better to keep it simple than try to make the desugarer a bit more clever .. 
but then it'll fall over at the next complication.

We've been here before...

http://www.haskell.org/pipermail/cvs-ghc/2010-November/057697.html
http://www.haskell.org/pipermail/cvs-libraries/2010-December/012569.html

Cheers,
        Simon




Simon


|  -----Original Message-----
|  From: [email protected] [mailto:[email protected]] On Behalf Of Max
|  Bolingbroke
|  Sent: 01 August 2011 08:55
|  To: Simon Peyton-Jones
|  Cc: Malcolm Wallace; Chris Dornan; [email protected]
|  Subject: Re: integer-simple
|
|  On 1 August 2011 08:09, Simon Peyton-Jones<[email protected]>  wrote:
|>  I'm guessing here, but I bet I know what's going on.  If integer-simple uses
|>  inexhaustive pattern matching, GHC will generate calls to 'patError' for the
|>  missing cases. That in turn generates a dependency on base, which is where
|>  patError is defined.
|
|  I checked this and you are right. If you build with -O0 you can see
|  the failure that Chris describes, because GHC does not eliminate some
|  of the patErrors. They come from (e.g.) xorDigits, whose tidied Core
|  is:
|
|  {{{
|  Rec {
|  xorDigits_raD
|    :: GHC.Integer.Type.Digits
|       ->  GHC.Integer.Type.Digits ->  GHC.Integer.Type.Digits
|  [GblId, Arity=2]
|  xorDigits_raD =
|    \ (ds_dh8 :: GHC.Integer.Type.Digits)
|      (ds1_afu :: GHC.Integer.Type.Digits) ->
|      let {
|        fail_dh9
|          :: GHC.Prim.State# GHC.Prim.RealWorld ->  GHC.Integer.Type.Digits
|        [LclId, Arity=1]
|        fail_dh9 =
|          \ _ ->
|            Control.Exception.Base.patError
|              @ GHC.Integer.Type.Digits
|              
"libraries/integer-simple/GHC/Integer.hs:(734,1)-(736,79)|function
|  GHC.Integer.xorDigits" } in
|      case ds_dh8 of wild_X1j {
|        GHC.Integer.Type.Some ipv_snV ipv1_snW ->
|          case ds1_afu of wild1_X1r {
|            GHC.Integer.Type.Some ipv2_snZ ipv3_so0 ->
|              case wild_X1j of _ {
|                GHC.Integer.Type.Some w1_afw ds2_afx ->
|                  case wild1_X1r of _ {
|                    GHC.Integer.Type.Some w2_afy ds3_afz ->
|                      case xorDigits_raD ds2_afx ds3_afz of tpl1_X5 { __DEFAULT 
->
|                      GHC.Integer.Type.Some (GHC.Prim.xor# w1_afw w2_afy) 
tpl1_X5
|                      };
|                    GHC.Integer.Type.None ->  fail_dh9 GHC.Prim.realWorld#
|                  };
|                GHC.Integer.Type.None ->  fail_dh9 GHC.Prim.realWorld#
|              };
|            GHC.Integer.Type.None ->  wild_X1j
|          };
|        GHC.Integer.Type.None ->  ds1_afu
|      }
|  end Rec }
|  }}}
|
|  They seem to originate from using bang patterns in the definitions:
|
|  {{{
|  xorDigits :: Digits ->  Digits ->  Digits
|  xorDigits None          (!ds)         = ds
|  xorDigits (!ds)         None          = ds
|  xorDigits (Some w1 ds1) (Some w2 ds2) = Some (w1 `xor#` w2) (xorDigits ds1
|  ds2)
|  }}}
|
|  Maybe the pattern match desugarer needs to be modified to see that the
|  pattern (!x) is irrefutable?
|
|  In the short term the workaround is to build the libraries with at least -O.
|
|  Max


_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc


_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to