[Haskell-cafe] Mutually recursive modules

Roman Cheplyaka roma at ro-che.info
Wed May 8 14:22:23 CEST 2013


Ah yes, thank you!

* Francesco Mazzoli <f at mazzo.li> [2013-05-08 08:51:12+0100]
> At Wed, 8 May 2013 09:46:08 +0300,
> Roman Cheplyaka wrote:
> > 
> > I wonder whether it's always possible to break cycles using GHC's
> > .hs-boot files.
> > 
> > Consider the following schematic example:
> > 
> >   module A where
> > 
> >   import B
> > 
> >   data A
> > 
> >   f :: B -> A
> >   f = undefined B.g
> > 
> >   module B where
> > 
> >   import A
> > 
> >   data B
> > 
> >   g :: A -> B
> >   g = undefined A.f
> > 
> > A.hs-boot must give a type signature for f, and since the signature
> > contains 'B', it must import 'B'. Ditto for B.hs-boot — it must import
> > 'A'.
> > 
> > Even if we treat all imports as {-# SOURCE #-}, there is still a cycle
> > between the hs-boot files.
> > 
> > So, am I right in understanding that these recursive modules cannot be
> > compiled by GHC at all?
> 
> This configuration works for me:
> 
> A.hs:
> 
>     module A where
>     import B
>     
>     data A
>     
>     f :: B -> A
>     f = undefined B.g
> 
> A.hs-boot:
> 
>     module A where
>     
>     import {-# SOURCE #-} B
>     
>     data A
>     
>     f :: B -> A
> 
> B.hs:
> 
>     module B where
>     import {-# SOURCE #-} A
>     
>     data B
>     
>     g :: A -> B
>     g = undefined A.f
> 
> B.hs-boot:
> 
>     module B where
>     data B
> 
> Then I can compile them:
> 
>     bitonic at clay /tmp % ghc -c B.hs-boot
>     bitonic at clay /tmp % ghc -c A.hs-boot
>     bitonic at clay /tmp % ghc -c B.hs 
>     bitonic at clay /tmp % ghc -c A.hs 
> 
> Francesco



More information about the Haskell-Cafe mailing list