If I have a type with a phantom parameter that I only sometimes care about, like this one:
data Foo p a b = Bar a b
Is there any hack way to write a type synonym Baz such that Baz a b is Foo p a b for some p that I've forgotten?
You can't do:
type Baz a b = Foo p a b
and while you can do (with appropriate extensions):
type Baz a b = forall p.Foo p a b
It doesn't seem like that does what I want, because I can't convert a value of type Foo P1 a b to type Baz a b, with a message about a "rigid type variable".
Do you need another layer of contructors to achieve this effect, as below? Could you briefly explain why?
data Baz' a b = forall p.Baz' (Foo p a b)
There isn't currently a way to do this as a type synonym. However, if you have GHC 7.10, you can turn on the PartialTypeSignatures extension and write Foo _ a b instead. Use -fno-warn-partial-type-signatures to ask GHC not to warn you about each of the holes you leave in this way.