[Haskell-cafe] advice on GADT type witnesses needed
David Roundy
droundy at darcs.net
Thu Jun 14 21:56:00 EDT 2007
Hi all,
Jason and I have been working on getting GADT type witnesses into darcs,
and have run into a puzzling error. For the life of me, I can't see how
this is an actual error, to the point that I'm wondering if it's actually a
bug in ghc. You can check out the code and reproduce this with
darcs get http://physics.oregonstate.edu/~roundyd/darcs-gadts
cd darcs-gadts
autoconf
./configure --with-type-witnesses
make darcs
At this point ghc will compile for a bit. It shouldn't get past Viewing,
since we haven't converted over much of the code yet, but it fails
inexplicably on Show. The error message we get is:
ghc -DPACKAGE_NAME=\"darcs\" -DPACKAGE_TARNAME=\"darcs\" -DPACKAGE_VERSION=\"1.0.9\" -DPACKAGE_STRING=\"darcs\ 1.0.9\" -DPACKAGE_BUGREPORT=\"bugs at darcs.net\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DGADT_WITNESSES=1 -DHAVE_TERMIO_H=1 -cpp -package regex-compat -package QuickCheck -package mtl -package parsec -package html -package unix -O -funbox-strict-fields -Wall -Werror -I. -I./src -i./src -DHAVE_CURSES -DHAVE_CURL -c src/Darcs/Patch/Show.lhs
src/Darcs/Patch/Show.lhs:50:0:
Quantified type variable `y' is unified with another quantified type variable `x'
When trying to generalise the type inferred for `showPatch'
Signature type: forall x y. Patch x y -> Doc
Type to generalise: Patch y y -> Doc
In the type signature for `showPatch'
When generalising the type(s) for showPatch, showComP, showSplit,
showConflicted, showNamed
make: *** [src/Darcs/Patch/Show.o] Error 1
The relevant code is
showPatch :: Patch C(x,y) -> Doc
showPatch (FP f AddFile) = showAddFile f
...
showPatch (Conflicted p ps) = showConflicted p ps
and the trouble comes about because of (in Core.lhs)
data Patch C(x,y) where
NamedP :: !PatchInfo -> ![PatchInfo] -> !(Patch C(x,y)) -> Patch C(x,y)
...
Conflicted :: Patch C(a,b) -> FL Patch C(b,c) -> Patch C(c,c)
Still, this makes no sense to me. If any type gurus could help clarify,
that would be great. Thanks!
--
David Roundy
Department of Physics
Oregon State University
More information about the Haskell-Cafe
mailing list