I agree on both points (technically).  It would allow you to apply that
restriction.  I only advise against it to reduce the impact the initial
implementation would have on the codebase, provided it is preferable to
implement it in phases.

As for inference. Rasmus and I have argued over that a fair bit, as I was
in favour of using 'new Entry<>' or just 'new Entry' to be a parameterised
type with no type constraints (any value).
On 20 Apr 2016 3:44 p.m., "guilhermebla...@gmail.com" <
guilhermebla...@gmail.com> wrote:

> 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 <
> codekest...@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>(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<A> {
>     public function __construct<B>(B $b) {}
> }
>
> $foo = new Foo<string>(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" <math...@rochette.cc> wrote:
>>
>> >
>> >
>> > On 20/04/2016 00:22, Sara Golemon wrote:
>> >
>> >> On Tue, Apr 19, 2016 at 1:16 PM, Mathieu Rochette <
>> math...@texthtml.net>
>> >> wrote:
>> >>
>> >>> about the upper bounds, have you consider another way of describing
>> the
>> >>> constraints, eg:
>> >>>
>> >>> class Box<T> where T is Boxable
>> >>>
>> >>> this would allow multiple constraints, eg:
>> >>>
>> >>> class Collection<T> 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<T as (Traversable | Countable)> {...
>> >>
>> >> 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 <T is A & B>)
>> >
>> >>
>> >> can generic types be nested ?
>> >>>
>> >>> class Stuff<A, B is Something<A, string>>
>> >>>
>> >>> 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
>

Reply via email to