[Haskell-cafe] Type Directed Name Resolution
Dan Doel
dan.doel at gmail.com
Wed Nov 10 16:59:40 EST 2010
On Wednesday 10 November 2010 2:08:56 pm Lauri Alanko wrote:
> So the proposal seems to be tailored specifically to fix some
> inconveniences with records. I'd much rather see a true record system
> for Haskell, since that would fix the namespace conflict problem in a
> more robust way.
I certainly agree with this.
> Plain ad hoc overloading might or might not be a sensible addition to
> Haskell, but please at least drop the "x .f" syntax, it's a pointless
> hack that makes the lexical status of "." even more difficult than it
> currently is. After all, one can simply define e.g. "x .$ f = f x" if
> postfix application is needed.
However, I don't completely agree with this. I agree with '.' perhaps not
being a good choice. However, if we do add completely ad-hoc overloading, I
think it might be useful to give functions subject to it a different syntactic
appearance, to alert to where it is being used.
----------
For a case study, Agda has type directed name resolution, but *only* for
constructors. If you try to define something else with the same name as a
constructor, or define two other values with the same name, it will reject
your program. This can be useful, since you can write:
_+N_ : Nat -> Nat -> Nat
zero +N n = n
suc m +N n = suc (m +N n)
_+F_ : forall {i j} -> Fin i -> Fin j -> Fin (i +N j)
zero +F n = n
suc m +F n = suc (m +F n)
But, it has two caveats, I think:
1) It seems significantly less of a burden due to the fact that Agda requires
you to write signatures for *every* function you write already.
2) Even with just the constructor case, enough ambiguity is introduced that
the Agda implementors recently added the ability to qualify a constructor by
its associated datatype. For instance, the signature:
foo : forall n -> n /= suc n
is ambiguous, since n has no principal type. You could fix this via:
foo : forall (n : Nat) -> n /= suc n
but there is now also support to write:
foo : forall n -> n /= Nat.suc n
I'll admit, the Agda overloading is handy. But I've always considered
Haskell's lack of ad-hoc overloading to be a feature. Type classes give
sensible types for what would normally be ad-hoc. Adding back ad-hoc functions
that have no available general type feels like a step backward. Perhaps that's
just me, though.
-- Dan
More information about the Haskell-Cafe
mailing list