I just noticed I originally missed "array" for #3. (The type is technically
recursive, ie "type Jsonable = int|string|float|bool|null|array<Jsonable>",
but that's another can of worms.)

On Wed, Apr 20, 2016 at 9:54 PM, Jesse Schalken <m...@jesseschalken.com>
wrote:

> If I had "scalar", "number" and ?T as types, the types I would need would
> be:
>
>    1. ?scalar|Decimal
>    2. ?scalar|Decimal|Expr
>    3. ?scalar|array
>    4. int|string (I *want* int|string here. I know array keys are always
>    int|string. A wider type is lies.)
>    5. ?scalar (probably)
>    6. number
>    7. T|false
>    8. ?T
>
> 5 out of 8 still need a union.
>
> On Wed, Apr 20, 2016 at 9:01 PM, Zeev Suraski <z...@zend.com> wrote:
>
>>
>>
>> > -----Original Message-----
>> > From: jesseschal...@gmail.com [mailto:jesseschal...@gmail.com] On
>> > Behalf Of Jesse Schalken
>> > Sent: Wednesday, April 20, 2016 1:12 PM
>> > To: Johannes Schlüter <johan...@schlueters.de>
>> > Cc: Andrea Faulds <a...@ajf.me>; PHP internals <internals@lists.php.net>
>> > Subject: Re: [PHP-DEV] Re: Improving PHP's type system
>> >
>> >    1. I have a function that converts values to SQL which have SQL
>> >    equivalents, including decimal values represented by a special
>> Decimal
>> >    class. It accepts int|string|bool|null|float|Decimal.
>> >    2. I have a class Expr which represents an expression in SQL.
>> >    Expressions can be composed of other expressions, and of literal
>> values, so
>> >    the constructors for Exprs accept
>> int|string|bool|null|float|Decimal|Expr.
>> >    3. I have a function that converts values to JSON that can be
>> reliably
>> >    converted back into their original. It accepts
>> int|string|bool|null|float.
>>
>> In other words, they accepts scalars (or nullable scalars).  Introducing
>> a scalar type would do the job.
>>
>> >    4. I have a function that returns the first key in an array (or
>> throws
>> >    an exception if empty). It returns int|string.
>>
>> I'd argue that here too, a scalar would be fine.  Worrying about a
>> floating point here is not a very relevant worry.
>>
>> >    5. I have a function that returns a value for a key in an array, and
>> >    removes the key. The type of the key is things that are valid array
>> keys
>> >    (int|string|bool|null IIRC).
>>
>> Scalar (or nullable scalar).
>>
>> >    6. I have a set of functions which operates on numbers. They accept
>> >    int|float.
>>
>> Numeric (to also include strings that look like numbers when strict is
>> not on).
>>
>> >    7. All the PHP functions which say "returns ... or FALSE on failure"
>> >    have their correct return type as T|false (where T is the return
>> value on
>> >    success) (or T|bool is "false" is not an allowed type).
>>
>> How many of those do we have?  As opposed to T|null?  I think most
>> functions that return objects return null on failure, not false.  And those
>> who don't can probably evolve to that approach.
>>
>> >    8. Nullability is nothing but a special case of union type with
>> T|null.
>>
>> Academically that's true, but practically speaking, the general T1|T2 is
>> almost always bogus while T|null subset makes a lot of sense.
>>
>> In reality, we can solve all the relevant use cases for union types by
>> relatively minor tweaks (or rather additions) to our scalar type hints, by
>> adding nullability, and by using interfaces where they make sense.
>>
>> Zeev
>>
>
>

Reply via email to