On Thu, Oct 18, 2018 at 10:48 AM, Burak Serdar <bser...@ieee.org> wrote:
> On Thu, Oct 18, 2018 at 11:35 AM Ian Lance Taylor <i...@golang.org> wrote:
>>
>> On Wed, Oct 17, 2018 at 11:58 AM, Burak Serdar <bser...@ieee.org> wrote:
>> >
>> > Instead of specifying the minimal set of operations a type should
>> > satisfy, why not describe what the type should look like:
>> >
>> > func f(in like T)
>>
>> I don't see how this approach can handle multiple types that need to
>> work together in some known way, like the Graph/Node/Edge case in the
>> design draft.
>
>
> Still discussing the details, but the graph case in the design draft
> can look like this:
>
> type Node like interface {
>    Edges() []Edge
> }
>
> type Edge like interface {
>    Nodes() (Node,Node)
> }
>
> type Graph like struct {
>    Nodes []*Node
> }
>
> func New(nodes []*Node) *Graph {
>   return &Graph{Nodes:nodes}
> }
>
>
> The instantiation:
>
> type MyNode struct {...}
>
> func (m MyNode) Edges() []MyEdge {...}
>
> type MyEdge  struct { ...}
>
> func (e MyEdge) Nodes() (*MyNode,*MyNode) {...}
>
> type MyGraph graph.Graph {
>   Nodes []*MyNodes
> }
>
> x:=graph.New(MyGraph)(myNodes)

Thanks.  I note the subtlety whereby the name Edge in the generic code
gets attached to the name MyEdge in the non-generic code, although it
does not appear anywhere in the call to graph.New.  There is a type
mapping happening somewhere.

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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to