On 30/05/2011, at 00:55, dm-list-haskell-pr...@scs.stanford.edu wrote:

> I'm absolutely not advocating making overlapping instances (or, worse,
> overlapping types) part of Haskell', nor under the impression that the
> committee would ever consider doing so.  I'm just pointing out that
> right now OverlappingInstances are the only way to do recursive
> programming at the type level, for the specific reasons I outlined.  I
> hope that before FunctionalDependencies or TypeFamilies or any other
> type-level programming becomes part of Haskell', there is a way to
> differentiate base and recursive cases *without* overlapping
> instances.

FWIW, I don't think this is really about type-level recursion. You can do 
recursive programming with type families:

data Z
data S n

type family Plus m n
type instance Plus Z n = n
type instance Plus (S m) n = S (Plus m n)

It's deciding type equality via overlapping instances that is problematic here. 
But, as others have pointed out, this is somewhat dodgy anyway. I suppose what 
you really want is something like this:

data True
data False

type family Equal a b

Where Equal a b ~ True if and only if a and b are known to be the same type and 
Equal a b ~ False if and only if they are known to be different types. You 
could, in theory, get this by defining appropriate instances for all type 
constructors in a program:

type instance Equal Int Int = True
type instance Equal Int [a] = False
type instance Equal [a] Int = False
type instance Equal [a] [b] = Equal a b
...

But that's infeasible, of course. However, nothing prevents a compiler from 
providing this as a built-in. Arguably, this would be much cleaner than the 
solution based on fundeps and overlapping instances.

Roman



_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-prime

Reply via email to