Simple GADT:
data GADT a where
MkGADT :: Int -> GADT Int
And function without type signature, with error:
ghci> inferGADT (MkGADT n) = "123"
<interactive>:14:24: error:
• Could not deduce: p ~ String
from the context: a ~ Int
bound by a pattern with constructor: MkGADT :: Int -> GADT Int,
in an equation for ‘inferGADT’
at <interactive>:14:12-19
‘p’ is a rigid type variable bound by
the inferred type of inferGADT :: GADT a -> p
at <interactive>:14:1-28
Possible fix: add a type signature for ‘inferGADT’
• In the expression: "123"
In an equation for ‘inferGADT’: inferGADT (MkGADT n) = "123"
• Relevant bindings include
inferGADT :: GADT a -> p (bound at <interactive>:14:1)
If I provide type signature - it's ok:
inferGADT ((MkGADT n)::(GADT Int)) = "123"
ghci> :t inferGADT
inferGADT :: GADT Int -> String
If i define term like this, haskell can infer type:
ghci> :t (MkGADT 1)
(MkGADT 1) :: GADT Int
In first case I do pattern matching, in second - just use constructor to build value.
Why haskell can't infer type in first case? For me it's look strange because I think all information needed to infer type is presented in MkGADT constructor, it explicitly show that MkGADT :: Int -> GADT Int
ps. From error message as I understand that it find that a ~ Int and "Could not deduce: p ~ String", why? - function definition given is just string "123"..
This is confusing, what happens here during type inference?
There are at least two incomparable types:
type family F a
type instance F Int = String
type instance F Char = ()
inferGADT :: GADT a -> String
inferGADT :: GADT a -> F a
Neither of these is a more general type than the other: taking a ~ Char in each these specialize to GADT Char -> String and GADT Char -> (). In fact, there is no type which is more general than all the other types that can be given to inferGADT.
So type inference fails, and demands that you tell it which of the incomparable types you want.