
Ah yes, thank you!
* Francesco Mazzoli
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@clay /tmp % ghc -c B.hs-boot bitonic@clay /tmp % ghc -c A.hs-boot bitonic@clay /tmp % ghc -c B.hs bitonic@clay /tmp % ghc -c A.hs
Francesco