termination for FDs and ATs

Stefan Wehr mail at stefanwehr.de
Wed May 3 16:24:21 EDT 2006


Manuel M T Chakravarty <chak at cse.unsw.edu.au> wrote::

> Martin Sulzmann:
>> Manuel M T Chakravarty writes:
>>  > Martin Sulzmann:
>>  > > A problem with ATs at the moment is that some terminating FD programs
>>  > > result into non-terminating AT programs.
>>  > > 
>>  > > Somebody asked how to write the MonadReader class with ATs:
>>  > > http://www.haskell.org//pipermail/haskell-cafe/2006-February/014489.html
>>  > >
>>  > > This requires an AT extension which may lead to undecidable type
>>  > > inference:
>>  > > http://www.haskell.org//pipermail/haskell-cafe/2006-February/014609.html
>>  > 
>>  > The message that you are citing here has two problems:
>>  > 
>>  >      1. You are using non-standard instances with contexts containing
>>  >         non-variable predicates.  (I am not disputing the potential
>>  >         merit of these, but we don't know whether they apply to Haskell'
>>  >         at this point.)
>>  >      2. You seem to use the super class implication the wrong way around
>>  >         (ie, as if it were an instance implication).  See Rule (cls) of
>>  >         Fig 3 of the "Associated Type Synonyms" paper.
>>  > 
>> 
>> I'm not arguing that the conditions in the published AT papers result
>> in programs for which inference is non-terminating.
>> 
>> We're discussing here a possible AT extension for which inference
>> is clearly non-terminating (unless we cut off type inference after n
>> number of steps). Without these extensions you can't adequately
>> encode the MonadReader class with ATs.
>
> This addresses the first point.  You didn't address the second.  let me
> re-formuate: I think, you got the derivation wrong.  You use the
> superclass implication the wrong way around.  (Or do I misunderstand?)

I think the direction of the superclass rule is indeed wrong. But what about
the following example:

    class C a
    class F a where type T a
    instance F [a] where type T [a] = a
    class (C (T a), F a) => D a where m :: a -> Int
    instance C a => D [a] where m _ = 42

If you now try to derive "D [Int]", you get

             ||- D [Int]
    subgoal: ||- C Int        -- via Instance
    subgoal: ||- C (T [Int])  -- via Def. of T in F
    subgoal: ||- D [Int]      -- Superclass

Stefa



More information about the Haskell-prime mailing list