[Haskell-cafe] Fwd: Increasing Haskell modularity

Miguel Mitrofanov miguelimo38 at yandex.ru
Thu Oct 2 09:31:26 UTC 2014


How can we merge two Sets if they carry different Ord dictionaries?

02.10.2014, 03:51, "Richard Eisenberg" <eir at cis.upenn.edu>:
> Thanks, Gesh, for the email below and the previous one, spelling out the distinction between coherence and global uniqueness. I had been conflating coherence and global uniqueness (as it seems others have been), and drawing this out is helpful.
>
> Though I can't yet say I'm in support, exactly, I'm less vehemently against this idea than I was this morning. In particular, I actually really like the idea of local class instances, which have occurred to me before but which I've never considered seriously.
>
> Unfortunately, this all breaks apart horribly when thinking about type instances. Global uniqueness, not just coherence, is needed for type instances:
>>  type family F a b
>>  type instance F a b = b
>>
>>  oops :: F a b -> b
>>  oops = id
>>
>>  unsafeCoerce :: a -> b
>>  unsafeCoerce = let type instance F a b = a in
>>                 oops
>
> The problem is that a type instance introduces a type equality. Haskell is capable of passing type equality evidence around, so equalities can escape their scope, if the programmer wants to do so. Thus, there can never be a situation where some type (in this case `F a b`) is equal to one thing in one context and an incompatible thing in a different context, anywhere in the same program. I've written my example above with non-associated types, but the same thing can be written with associated types (and more syntactic overhead). I can't currently imagine a type-safe system that did not require global uniqueness for type instances.
>
> For what it's worth, I think I can agree that types like `Set` should carry around the relevant `Ord` dictionary. Global uniqueness of class instances is already threatened by all manner of extensions; we've just been much more careful about global uniqueness of type instances.
>
> Richard
>
> On Oct 1, 2014, at 6:05 PM, Gesh <gesh at gesh.uni.cx> wrote:
>>  On 10/1/2014 11:42 PM, Bardur Arantsson wrote:
>>>  (I say "proposal"... this needs some serious fleshing out and a
>>>  semi-formal specification for instance resolution rules &c before it
>>>  becomes a proposal. Just "Look at Oleg's paper" is not good enough.)
>>  I see I came off unclearly. Please allow me to remedy that.
>>
>>  My reference to Oleg's paper was badly framed. What I meant to say was
>>  more along the following lines:
>>  Oleg discussed adding local typeclass instances in his reflection paper.
>>  For some reason, his proposal wasn't taken. (Does anyone know why?)
>>  I'd like to suggest something along similar lines:
>>  Allow instances in let-expressions and where-clauses. These instances
>>  shadow other instances with the same parameter list.
>>  Similarly, instances defined in modules shadow imported instances.
>>
>>  Thus, in the following program:
>>>  module Foo where
>>>  import Bar (Baz) -- Where Bar defines instance Show (Baz a)
>>>  instance Show (Baz a) where -- shadows the imported instance
>>>  foo = let instance Show (Baz a) where -- shadows the instance defined
>>>        in ...              -- in where below, just like other bindings
>>>    where instance Show (Baz a) -- shadows the module-global instance
>>>          instance Show (Baz Quz) -- only allowed with
>>>          -- OverlappingInstances, isn't shadowed by any of the other
>>>          -- instances in this example.
>>  In this example, the instances for Baz have the following scopes:
>>  * From Bar: Nowhere, as it is immediately shadowed.
>>  * From Foo: Within all top-level declarations besides foo, as foo's
>>             where clause shadows it.
>>  * From the where clause: Within the where clause. The instance for
>>                          Baz Quz is also visible within the let
>>                          expression, as it is not shadowed by it.
>>  * From the let expression: Within the let expression.
>>
>>  Basically all I'm doing is applying regular name resolution semantics
>>  to instances with the same parameter lists.
>>
>>  I hope this helps clarify things. If not, please tell me what needs to
>>  be done to fully clarify this.
>>
>>  Gesh
>>  _______________________________________________
>>  Haskell-Cafe mailing list
>>  Haskell-Cafe at haskell.org
>>  http://www.haskell.org/mailman/listinfo/haskell-cafe
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe


More information about the Haskell-Cafe mailing list