type aliases and Id

Lennart Augustsson lennart at augustsson.net
Thu Mar 22 04:00:43 EDT 2007


A very good point.  But that just makes a design that could include  
Id even more intriguing. :)

	-- Lennart

On Mar 22, 2007, at 01:21 , oleg at pobox.com wrote:

>
> Lennart Augustsson wrote:
>> Ganesh and I were discussing today what would happen if one adds Id
>> as a primitive type constructor.  How much did you have to change the
>> type checker?  Presumably if you need to unify 'm a' with 'a' you now
>> have to set m=Id.
>
> I wonder if this proposal is a good idea.
>
> Let us consider the following near-Haskell98 code
>
>> class C a
>> instance C (m a)
>> instance C Int
>
> (usually there will be constraints on m. We shall see a useful  
> example of
> this in a moment). This code typechecks under slight and common
> relaxation of the rules on the form of instance head. That example
> will probably typecheck in Haskell'.
> Under the proposal that Id t === t, typechecking
> of this code will require overlapping instances, which quite  
> unlikely to
> make it into Haskell' and is a quite significant and controversial
> extension.
>
> Speaking of overlapping instances, let's generalize the example to
>
>> class C a
>> instance C (m a)
>> instance C a
>
> It does typecheck in current Haskell. Under the Id proposal, this
> example will NOT typecheck, ever. This is because the two instances
> become exact duplicates. Indeed, every type that matches "a" will
> match "m a" (with m = Id) and vice versa. The two instances match the
> same class of types (that is, all of the types).
>
> Let us come back to our simple example and make it practical.
>
>> class C a where incr :: a -> a
>>
>> instance (C a, Functor m) => C (m a) where incr = fmap incr
>> instance C Int where incr = succ
>>
>> test = incr (Just [[[1::Int]]])
>
> the example increments integers deeply embedded in some functorial
> data structures. The operations of this kind are requested from time
> to time on Haskell-Cafe. This code compiles and works (no overlapping
> or undecidable instances are required). Under the Id t === t
> proposal, this example will diverge (perhaps, it will diverge even in
> the compiler). The reason is that the base case cannot be reached; the
> type Int can always be considered as Id Int and so the first instance
> will apply again.
>
> _______________________________________________
> Haskell-prime mailing list
> Haskell-prime at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-prime



More information about the Haskell-prime mailing list