Hi,

I was under the impression that the Prep'd Core is still in reverse dependency order, i.e. if definition A refers to intra-module definition B, then A's binding will always be preceding B's binding. I've been exploiting this (hopefully not made-up and accidental!) property in my work so far.

However, for the following input:

```

$s$fFunctorFun_$sfmap
  :: forall a b.
     (a -> b)
     -> Fun '[AnnexType, CSASource, Currency, String] a
     -> Fun '[AnnexType, CSASource, Currency, String] b
$s$fFunctorFun_$sfmap
  = (\ (@a)
       (@b)
       (f :: a -> b)
       (g :: Fun '[AnnexType, CSASource, Currency, String] a)
       (x1 :: AnnexType) ->
       let {
         g1 :: TFun '[CSASource, Currency, String] a
         g1
           = (g `cast` <Co:32>) x1 } in
       (\ (x2 :: CSASource) ->
          $s$fApplicativeFun_$s$fFunctorFun2
            @Currency
            @a
            @b
            f
            (((g1 `cast` <Co:55>) x2)
          `cast` <Co:22>)
       `cast` <Co:148>)
    `cast` <Co:125>)
```

I am getting the following output from Prep:

```
sat_s2iCp
  :: forall a b.
     (a -> b)
     -> Fun '[AnnexType, CSASource, Currency, String] a
     -> Fun '[AnnexType, CSASource, Currency, String] b
sat_s2iCp
  = (\ (@a)
       (@b)
       (f :: a -> b)
       (g :: Fun '[AnnexType, CSASource, Currency, String] a)
       (x1 :: AnnexType) ->
       let {
         g1 :: TFun '[CSASource, Currency, String] a
         g1
           = (g `cast` <Co:32>) x1 } in
       let {
         sat_s2iCo :: CSASource -> Currency -> Fun '[String] b
         sat_s2iCo
           = \ (x2 :: CSASource) ->
               $s$fApplicativeFun_$s$fFunctorFun2
                 @Currency
                 @a
                 @b
                 f
                 (((g1 `cast` <Co:55>) x2) `cast` <Co:22>) } in
       sat_s2iCo
       `cast` <Co:148>)
    `cast` <Co:125>


$s$fFunctorFun_$sfmap
  :: forall a b.
     (a -> b)
     -> Fun '[AnnexType, CSASource, Currency, String] a
     -> Fun '[AnnexType, CSASource, Currency, String] b
$s$fFunctorFun_$sfmap
  = \ (@a)
      (@b)
      (eta_B0 :: a -> b)
      (eta_B1 :: Fun '[AnnexType, CSASource, Currency, String] a) ->
      sat_s2iCp @a @b eta_B0 eta_B1
```

Note that the body of `$s$fFunctorFun_$sfmap` has been lifted out to `sat_s2iCp`, but the binding of `sat_s2iCp` precedes the binding of `$s$fFunctorFun_$sfmap`.

Is this expected, for some reason, or is this a GHC bug? If the latter, I'm happy to file a ticket but I can't promise an actual end-to-end compilable reproducer...
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to