[Haskell-cafe] a variant of TDNR (was: Re: Some thoughts on Type-Directed Name Resolution)
Evan Laforge
qdunkan at gmail.com
Tue Feb 7 03:09:46 CET 2012
I brought up an idea on another thread, but it was a bit off subject
and I think it got buried. Anyway, I'm curious to know if there are
any obvious problems with this idea, or if it could be pursued
further:
It could be called Tagged Type Directed Name Resolution.
The idea is a # prefix for identifiers. #f is a "type directed function". It
requires the type of its argument to be monomorphic, and is desugared to M.f,
where M is the module defining the type of 'f's argument.
Everything else remains the same. Records wishing the same name must live in
separate modules, but field access looks like: (#a . #b) record
This works to set fields of a record as well. Let M.f be a function from
a record to a lens focused on a certain field of that record. Now you can
write:
M.a :: M.Record -> Lens M.Record M.A
set :: Lens record field -> record -> record
val = set (#a 42) record
which becomes: set (M.a record) 42
Or composed 'set ((#a.#b) record) 42' becomes 'set ((M.a . N.b) record) 42'
An operator with convenient fixity should be able to remove the parens.
As long as the compiler can figure out a monomorphic type expected by the input
of #a then it shouldn't need type annotations.
The thing I'm not sure about is if the ghc typechecker can do this. It would
know that '#a' is a function 'alpha -> beta', then need to figure out what
alpha is. Then once it has a monomorphic type for alpha, then it has to look
up a symbol 'a' in the module defining that type, and only then does it know
the type of beta. If #b.#a style composition is to work, then of course '#b'
would have to hold off until the return type of '#a' has been resolved.
I don't know how hard that would be, or it would even be possible.
This idea is less powerful than other proposals because the #-decorated
function must be able to statically determine a monomorphic type for its
argument. So no structural types. And no records with the same field
name in the same module. Personally that doesn't bother me much since
I try to keep modules small, but perhaps that could be addressed in an
orthogonal nested module feature.
The '#' prefix would mess up people using that as an operator. I guess @ is
free, right?
More information about the Haskell-Cafe
mailing list