Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:92544 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 48029 invoked from network); 20 Apr 2016 14:44:30 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 20 Apr 2016 14:44:30 -0000 Authentication-Results: pb1.pair.com smtp.mail=guilhermeblanco@gmail.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=guilhermeblanco@gmail.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain gmail.com designates 209.85.223.174 as permitted sender) X-PHP-List-Original-Sender: guilhermeblanco@gmail.com X-Host-Fingerprint: 209.85.223.174 mail-io0-f174.google.com Received: from [209.85.223.174] ([209.85.223.174:34236] helo=mail-io0-f174.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id F1/5B-14036-DC597175 for ; Wed, 20 Apr 2016 10:44:29 -0400 Received: by mail-io0-f174.google.com with SMTP id 2so54447285ioy.1 for ; Wed, 20 Apr 2016 07:44:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=3EKYuKZFxUP21yiOtubMapEAi6Rq2JxOoDc7Fhf0TWQ=; b=bpC8yP9MdUHzjjuLOG+mIS7CRgbyi0wOwrHWvHdU48AEZQSo11nLmx7xjGL71N8s0+ tM+JSQC93B/wx3X+uO2wYGLnHMA4a1aOtlmXSkeLces27pv2YiWBt7liPgcX+dl20t5W J07rlrpCskFZlRgbH2xhy8tNSsQq9JVeu0vg3dKf+6yOrIw2GQzFAaRSPJ6so67+yVN8 rLgLDIimIjDuoVDqd5fbao5mCOYFOv64w42D2gDuUvEdyct17sYAr0f3Q2aoYA11R3ae JamVOgaWxBPv4Fw1xpihXCI3qrS42Cj7OpFIBzOczNG+CIt8MrfylIFEpL42Qg/b2kvJ guPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=3EKYuKZFxUP21yiOtubMapEAi6Rq2JxOoDc7Fhf0TWQ=; b=f97tZ3Z7QoEwDCVkZN9H03ukaoMNuRhC1szitj7PMGY94TfokMNX5vKUKbuSTTTjHj h3ggaWxEk5EwAJLRwM0O/vSaYCk8ZznecoTs/mez9hEc8dycSVmmuOeTpfGcXHZAyI2M +Hmv0+iI4fMt+rcHABFiA0w6xNI+DK1eRJGOnE7Zj0HxLgr6FeLPvYJnB9/qy9ENQd1A reUe7Fy7bBw8xhh/XNdt4IiYQHecLnFZEbsPG0tTKuQZVPMmL1Vyxwr+ordb/FQZdlhI 9CwiwTftOzcshLz6X9Fs/lUD50CTTbLMbmbOyq7SDz28OLVS7CC3WVQ+51Hyy76blcdw 6yAw== X-Gm-Message-State: AOPr4FV0j/zzvPAc0ygHpWHTKI6DSY/XLJ+WdHhg5dTlMU1HsIKSDaUGkIZV94zbQcw/BvkId4vN8j8TfEdvwg== X-Received: by 10.107.62.136 with SMTP id l130mr10079403ioa.185.1461163466198; Wed, 20 Apr 2016 07:44:26 -0700 (PDT) MIME-Version: 1.0 Received: by 10.50.85.10 with HTTP; Wed, 20 Apr 2016 07:44:06 -0700 (PDT) In-Reply-To: References: <3cc8a4c7-2640-11ae-a67b-06f909ac1e27@texthtml.net> <57173859.4080501@rochette.cc> Date: Wed, 20 Apr 2016 10:44:06 -0400 Message-ID: To: Dominic Grostate Cc: Mathieu Rochette , "Ben Scholzen 'DASPRiD'" , Josh Di Fabio , Mathieu Rochette , Sara Golemon , PHP internals , Rasmus Schultz Content-Type: multipart/alternative; boundary=94eb2c0883e05c93c00530eba146 Subject: Re: [PHP-DEV] [RFC:generics] From: guilhermeblanco@gmail.com ("guilhermeblanco@gmail.com") --94eb2c0883e05c93c00530eba146 Content-Type: text/plain; charset=UTF-8 I don't know if mid-thread answering may lead to top-posting, but if it does, I'm sorry... =\ Answer inline: On Wed, Apr 20, 2016 at 5:10 AM, Dominic Grostate < codekestrel@googlemail.com> wrote: > I've made an amendment to the RFC to clarify on the Nested Types, which is > indeed supposed to be part of the feature. Rasmus may want to reword it if > it isn't very clear. > > Regarding union and intersections for upper (and maybe lower) bounds. > Would it be appropriate to exclude these from type parameters until their > respective RFCs are approved? As including them in generics but not in > standard type hints may create an inconsistency. > > In short, perhaps a generics implementation should incorporate unions (and > any future type constraints) as existing features only. This would help > RFC Generics to focus on: Type aliasing, Introspection and Reflection. > Unions and Intersections are required anyway, and I don't see how you can implement generics without supporting them. Let's say I'm implementing a cache library that segregate the interface of BulkOperations from the basic operations named CacheDriver. In a given class, I might want to only accept CacheDrivers that also support BulkOperations. How would I achieve that? The same happens to upper bounds that someone asked for an example privately. If I want to hire/move a person to a department that is registered in the system, but is not a 3rd party company person, how would you achieve that considering the following class structure? class Person {} class Employee extends Person {} class AssociateEmployee extends Employee {} class Manager extends Employee {} Considering your function: function assignToDepartment(T $person) : bool; Generic type "T" in the function prototype needs to accept Person (new hire), Employee and Manager (transfer), but not AssociateEmployee. Considering upper bounds support only, your best bet is "T extends Person", but that would accept AssociateEmployee to be provided, which contradicts the business rule. Accepting anything lower in the hierarchy prevents new hires. That's when lower bounds comes into play. If you define as "T super Manager", all Person, Employee and Manager gets accepted, but not the AssociatedEmployee, matching properly the business rule. Also, someone else asked about type inference over my comment #4 in this example: class Foo { public function __construct(B $b) {} } $foo = new Foo(1); The question asked is if that "string" was an inference over A or B. The correct answer is A, because generic type B is inferred from the parameter (integer) provided. That is exactly why class generic type definition should never be inferred from the constructor arguments, because you make it impossible to support both constructor generic types AND class generic type definitions at the same time. > On 20 Apr 2016 9:05 a.m., "Mathieu Rochette" wrote: > > > > > > > On 20/04/2016 00:22, Sara Golemon wrote: > > > >> On Tue, Apr 19, 2016 at 1:16 PM, Mathieu Rochette > > >> wrote: > >> > >>> about the upper bounds, have you consider another way of describing the > >>> constraints, eg: > >>> > >>> class Box where T is Boxable > >>> > >>> this would allow multiple constraints, eg: > >>> > >>> class Collection where T is Traversable, T is Countable > >>> > >>> IMO, this sort of problem should be solved by combining this feature > >> with union types, so you could have something like: > >> > >> class Collection {... > >> > >> And merely inherit the logic rules from that feature rather than > >> inventing yet another one. > >> > > obviously if the union type rfc passes we don't need another way of > > expressing this. > > that was only in the case it does not, I think having a way to have at > > least types intersection > > is useful here (and I didn't event think about ) > > > >> > >> can generic types be nested ? > >>> > >>> class Stuff> > >>> > >>> I can't imagine why not... > >> > > just to be clear, it's not just nested generic. the A type have to be > same > > in both "subtypes" > > > >> > >> For my part, I love the concept overall. Generics are an important > >> part of moving PHP towards comprehensive type-safety. But then, you > >> know how I feel about Hack. :) > >> > >> -Sara > >> > >> > > > -- Guilherme Blanco Lead Architect at E-Block --94eb2c0883e05c93c00530eba146--