[Haskell-beginners] ~ type operator
James Cook
mokus at deepbondi.net
Fri Jun 24 16:34:37 CEST 2011
On Jun 24, 2011, at 7:44 AM, Guy wrote:
> On 24/06/2011 12:10, Daniel Fischer wrote:
>> On Friday 24 June 2011, 10:26:42, Guy wrote:
>>> What does the ~ type operator mean? I've sometimes seen types such
>>> as (a
>>> ~ b) in error messages, but can't understand what GHC is trying to
>>> tell
>>> me.
>>
>> Type equality, (a ~ b) means that a and b are the same type
>> (rather, that
>> the compiler can prove they're the same).
>
> So where is it useful to say a ~ b, rather than using a twice?
The original motivation, I believe, was for use with a some of the
more advanced type system extensions: type families and GADTs
(apologies if you haven't run across these before; I'm not going to
give a detailed explanation of them because Google already has that
covered, just a couple of examples assuming familiarity with them).
In code using the vector-space[1] package, you might wish to use a
constraint such as:
> Scalar a ~ Scalar b => ...
Scalar is essentially a type-level function, and this constraint
asserts that it maps two different types to the same type.
In the process of type-checking code using GADTs, GHC will also
"discover" type equalities that may not be obvious. For example,
> data Eq a b where Refl :: Eq a a
>
> coerce :: Eq a b -> a -> b
> coerce Refl x = x
When checking this code, GHC infers that within the definition of
'coerce', x has a type something like "a ~ b => a". Which is to say,
'a' and 'b' are still distinct type variables, but they happen to
provably have the same value (in this particular context).
-- James
[1] http://hackage.haskell.org/package/vector-space
More information about the Beginners
mailing list