On Saturday, 1 September 2018 20:29:31 UTC+2, Axel Wagner wrote:
>
> I don't understand what you are trying to say. You assert that there
> wouldn't be a type-error, but you don't actually justify that.
>
There are 2 examples, both are (to me) intuitive suggestions and not the
result of a phd thesis worth of research :) continued below.
It seems pretty obvious to me, that if you instantiate my MultiReader
> example to, say, *strings.Reader, it would fail to compile. Because
> *multiReader is not a *strings.Reader (and you'd have to replace R with
> *strings.Reader *everywhere* in the signature, that is the exact reason
> we want generics to begin with).
>
That's why I didn't use R for another, distinct Reader. For the signature
of your MultiReader example I changed the return type from "R" (the type
argument) to "Reader" (the name of the contract). In a hand-wavy formal
way, the return type would serve as a new type argument to Reader,
independent of R. Put in an intuitive (to me) way: Since MultiReader
returns something which presumably conforms to the contract Reader, why not
just say that instead of the type argument R?
> The example you give for "unifying this" isn't actually syntactically
> correct, AFAICT. At least I can't find anything in the design that would
> allow using the identifier of the contract in its arguments - and it's
> unclear to me what that would mean.
>
Apologies, I'm responding to the proposal, just giving my 2 cents. I am
not asserting that the examples I give are syntactically correct according
to the proposal. I am suggesting that the concepts of "contract" and
"interface", can (probably) be defined for Go
in a unified way. I am not supposing the definitions in the proposal of
"interface" and "contract" in suggesting this; to the contrary I am
suggesting these concepts are what Go would define them to be and hence are
flexible and not yet fixed. I do not think saying interfaces and contracts
are different because the proposal or other background such as Haskell or
type theory treat them differently is a convincing counterargument to my
suggestion of exploring the unification of contract and interface.
>
> To provide another way to clarify that interfaces and contracts are
> different:
>
This again assumes a priori interfaces and contracts are different. I am
trying to suggest to drop this assumption and see what happens. To me, it
seems, so far, good things would happen.
> * How would you build fmt.Println using contracts?
>
* One of the main motivators behind adding generics is the lack of
> type-safety for containers (say, container/list). While all methods mention
> the same type, interface{}, it is not checked for consistency between
> invocations. This is a bug for type-safe containers, but it's a feature for
> fmt.Println.
>
So perhaps containers could use a contract which does not instantiate each
type argument distinctly, forcing uniformity of types and
more or less like in the proposal. And perhaps situations desiring
heterogenous types, such as fmt,*f(), could use a different kind of
contract which instantiates each type argument independently at the call
site. To distinguish them, some syntax could be proposed such as
contract Reader(r Reader.(*)) { ... }
vs
contract Reader(r Reader) {...}
I am far from the genius who is capable of thinking this idea through and
making it as solid as the proposal overnight. Just expressing the opinion
that unifying the concepts of contract and interface seems to me like a
good idea to explore, and that a priori assuming they are different doesn't
help advance exploring it.
Scott
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.