[Haskell-cafe] Fwd: Increasing Haskell modularity

Paolo Giarrusso p.giarrusso at gmail.com
Fri Nov 7 18:00:03 UTC 2014


On Thursday, October 2, 2014 11:30:20 AM UTC+2, Dominique Devriese wrote:
>
> Daniel, 
>
> This is an interesting discussion and I personally also think Haskell 
> should in time move away from global uniqueness of instances, at least 
> as the default. 
>
> 2014-10-02 10:50 GMT+02:00 Daniel Trstenjak <daniel.t... at gmail.com 
> <javascript:>>: 
> > On Thu, Oct 02, 2014 at 12:44:25AM +0300, Gesh wrote: 
> >> Correct, although that's not what I said. I just said that a case could 
> >> be made for saying the design of programs around global uniqueness was 
> >> poorly thought out. 
> > 
> > I think the problem is, that for some type classes global uniqueness is 
> > a very good idea and for some it might not be that relevant. 
> > 
> > If there's e.g. a PrettyPrint type class, then one might argue, that 
> > it's a good idea to be able to change the pretty printing of a data type 
> > depending on the context. 
> > 
> > But for a type class represeting the equality of a data type it might be 
> > more harmful then good, to be able to change it. 
>
> I think you're right that whether we want global uniqueness of 
> instances depends on the situation. However, it doesn't just depend on 
> the type class in question. 
>
> Consider for example the Ord type class.  The fact that we sometimes 
> want to use different orderings for the same data types is clearly 
> evidenced by the existence of functions such as sortBy and all of the 
> "comparing ..." stuff in Data.Ord. On the other hand, there is the 
> fact that data types like Set crucially depend on being used with a 
> single Ord instance for correctness. 
>
> As you suggest, a way to deal with this could be to make a data type 
> like Data.Set carry around the Ord instance, something like this: 
>
>     data Set a where SomeInternalConstructor :: Ord a => ... 
>     insert :: a -> Set a -> Set a 
>
> However, it seems a bit unfortunate to me that this extra data (the 
> type class dictionary) would be carried around at runtime instead of 
> it being inferred and potentially compiled out at compile time. 
>
> I wonder if a more static alternative could be to introduce some 
> limited form of dependent types (I'm reminded of Scala's 
> value-dependent types) to index the Data.Set data type with the Ord 
> instance that it should be used with, something like: 
>

 

>
>    data Set a (instOrdA :: Ord a) where ... 
>    insert :: (ordA :: Ord a, ordA ~v instOrdA) => a -> Set a instOrdA 
> -> Set a instOrdA 
>
> In such code, the constraint "ordA ~v instOrdA" would require that the 
> two instances are equal in some intentional and decidably checkable 
> way (i.e. no automatic unfolding of recursive definitions and such). 
> Perhaps it's not even needed to require the "(ordA :: Ord a, ordA ~v 
> instOrdA) =>" contraint, but the compiler could somehow just take the 
> instance from the "Set a instOrdA" type and make it available for type 
> class resolution in the body of insert? 
>

I also like this design, and it's been discussed before in the same context 
(http://lists.seas.upenn.edu/pipermail/types-list/2009/001412.html). I know 
a few ways to allow checking the constraints, but I'm not sure whether any 
of these fits with Haskell:

- using definitional equality like in dependent types, or some encoding 
thereof (e.g. with empty types, as when encoding Peano numbers in the 
Haskell type system)
- using singleton types, as in Scala (not really powerful, and does not fit 
with Haskell). However, Scala's relevant feature arise from making ML 
modules first-class and unifying them with objects. For Haskell, I'd leave 
out objects and get to...
- use some variant of ML modules, where the modules are easier to compare 
because they're second-class  (I wonder whether that means using singleton 
kinds where Scala uses singleton types). Given that the upcoming Backpack 
descends from a form of ML modules, this might be more relevant than is 
currently apparent (to me at least).



Anyway, I agree with Gesh that at some point, Haskell should deprecate 
> global uniqueness of type class instances, but we should first explore 
> alternatives for modeling data types like Set that currently depend on 
> it.  There's still quite some room for research here in my opinion.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20141107/32413a1f/attachment.html>


More information about the Haskell-Cafe mailing list