>
> > I'm wondering what fundamentally separates inference of arguments from
> inference of returns, FWIW. Why is it a problem if we try to infer the
> return-type when assigning to an interface, but not when we try to infer
> the parameter-type when passing one?



> The difference is the directionality.  Argument passing is like
> assignment.  When I write "a = b", and b has an interface type, then a
> also has to have an interface type.  So type inference for passing an
> argument means that passing an interface type (b) gives you an
> interface type (a).  But for results it's the other way around.  Now
> we know type a and we are trying to infer type b.  And when a has an
> interface type, b can be anything that implements that interface.  As
> you say, we can simply reject the case.  We pretty much have to.  But
> it might be confusing that we can do inference for some result type
> but not others.  And it's a kind of confusion that arises only for
> results, not for arguments.


It is a situation that seems easily explainable, so teachable.

The single possibility case "specific = specific" says this about inference:
unknown = specific, infer unknown matches specific
specific = unknown, infer unknown matches specific

The multiple possibility cases are as you say:
unknown = nonspecific, infer unknown matches nonspecific (identical
interfaces)
nonspecific = unknown, no inference possible; unknown may be any of
multiple possibilities.

The teachable maxim is: "can infer from single choice; cannot infer from
multiple choices"

On Fri, Jun 19, 2020 at 4:03 PM Ian Lance Taylor <i...@golang.org> wrote:

> On Fri, Jun 19, 2020 at 2:40 PM Axel Wagner
> <axel.wagner...@googlemail.com> wrote:
> >
> > On Fri, Jun 19, 2020 at 10:37 PM Ian Lance Taylor <i...@golang.org>
> wrote:
> >>
> >> On Fri, Jun 19, 2020 at 12:44 PM Brandon Bennett <benn...@gmail.com>
> wrote:
> >> >
> >> > I was playing around with a, probably not good, idea of what a
> rust-like Return type would look like:
> https://go2goplay.golang.org/p/k0NKN9Q6Wc1
> >> >
> >> > It seems when we are returning a specific value like Result(int) from
> a function as in
> >> >
> >> > func myFunc(input string) Result(int) {
> >> >         return Err(int)(ErrBadValue)
> >> > }
> >> >
> >> > That it would be nice if we didn't have to specify Err(int) and that
> it could be inferred from the return type instead.
> >>
> >> If I'm reading this right, you are suggesting that because the result
> >> of Err is being assigned to a value of type Result(int) (via the
> >> return statement) we should be able to use that fact to infer the type
> >> argument of Err.  I think that would be possible for cases where we
> >> are assigning to a variable of known type.  It's a little more
> >> confusing when using := to assign to a variable whose type is not yet
> >> known.  And it also seems unlikely to work when assigning to a
> >> variable of interface type.
> >
> >
> > I think the solution to this would probably be the same as if you use `x
> := nil` - a compiler-error stating that there can't be a type assigned to
> the RHS. I think it would be fine to just require type-annotations where we
> can't clearly and unambiguously infer a type, as long as those cases are
> understandable - the two examples seem easy to understand exceptions, so as
> long as not more come up, that would still be fine IMO.
> >
> > That being said, I assume you generally see the value in more
> type-inference and I trust you to come up with decent rules for this
> eventually :)
> >
> > I'm wondering what fundamentally separates inference of arguments from
> inference of returns, FWIW. Why is it a problem if we try to infer the
> return-type when assigning to an interface, but not when we try to infer
> the parameter-type when passing one?
>
> The difference is the directionality.  Argument passing is like
> assignment.  When I write "a = b", and b has an interface type, then a
> also has to have an interface type.  So type inference for passing an
> argument means that passing an interface type (b) gives you an
> interface type (a).  But for results it's the other way around.  Now
> we know type a and we are trying to infer type b.  And when a has an
> interface type, b can be anything that implements that interface.  As
> you say, we can simply reject the case.  We pretty much have to.  But
> it might be confusing that we can do inference for some result type
> buts not others.  And it's a kind of confusion that arises only for
> results, not for arguments.
>
> Ian
>
> --
> 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 golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/CAOyqgcVxC%3D1bBoL4JcmWG8ODkyK1UXJ8%2B8id-S_LmQOtcw%3DcUw%40mail.gmail.com
> .
>


-- 

*Michael T. jonesmichael.jo...@gmail.com <michael.jo...@gmail.com>*

-- 
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 golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CALoEmQz8YhVnkgf_Ca%2BQo7fSLCuyHQfyKyKwiTLJrA-bQcfgEA%40mail.gmail.com.

Reply via email to