Re: [RFC] Nullable Types
| From: | Quim Calpe | Date: | Fri, 22 Apr 2016 09:42:34 +0000 |
| Subject: | Re: [RFC] Nullable Types | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-92634@lists.php.net to get a copy of this message | ||
On Thu, Apr 21, 2016 at 9:52 PM, Fleshgrinder <php@fleshgrinder.com> wrote:
> On 4/21/2016 1:00 PM, Lin Yo-An wrote:
> > I think this is not to make PHP like Java, and it totally makes sense -
> > Nullable should be a type of a type instead of a state. In Haskell it's
> > named Maybe or Option, and It's better than NullPointerException.
> >
> > Here is a discussion from Haskell community:
> >
> > https://mail.haskell.org/pipermail/haskell-cafe/2011-April/091269.html
> >
>
> Why is it /better/?
>
> final class None {}
>
> final class Some {
>
> public $value;
>
> public function __construct($value) {
> $this->value = $value;
> }
>
> }
>
> final class Maybe {
>
> private static $none;
>
> private $value;
>
> private function __construct($value) {
> $this->value = $value;
> }
>
> public static function NOTHING() {
> if (self::$nothing === null) {
> self::$nothing = new Nothing();
> }
> return new static(self::$nothing);
> }
>
> public static function SOME($value) {
> return new static(new Some($value));
> }
>
> public function hasSome(): bool {
> return $this->value !== static::$none;
> }
>
> public function isNone(): bool {
> return $this->value === static::$none;
> }
>
> public function unwrap() {
> if ($this->value === static::$none) {
> trigger_error('NullPointerException', E_USER_ERROR);
> }
> return $this->value->value;
> }
>
> }
>
> // ----------------------------------------
>
> function f1(): Option {}
>
> $x = f1();
> if ($x->hasSome()) {
> echo $x->unwrap(); // 42
> }
>
> $x = f1();
> if ($x->isNone()) {
> echo -1;
> }
>
> echo f1()->unwrap(); // error: NullPointerException :P
>
> // ----------------------------------------
>
> function f2(): ?int {}
>
> $y = f2();
> if (isset($y)) {
> echo $y; // 42
> }
>
> $y = f2();
> if ($y === null) {
> echo -1;
> }
>
> echo f2(); // null
>
> You can easily build your own Option or Maybe and add the additional
> bookkeeping to your runtime but it will not make your program more
> secure or anything. It just adds more method calls and makes it more
> verbose.
>
> You can already use static code analyzers to detect if null is being
> ignored in your code, however, right now they mainly have to rely on
> PhpDoc that is often not properly documented. Adding an explicit syntax
> to PHP for documentation would make PhpDoc obsolete and allow static
> code analyzers to perform their job better and PHP to error out during
> runtime if something else is being returned.
>
> Honestly, null is not our problem. Every language has its null, just
> because they wrap it or rename it does not make null suddenly vanish
> from the universe. :P
>
> --
> Richard "Fleshgrinder" Fussenegger
>
>
IMHO, the point of Optional types is the intention, if you get an
Option<Foo> from a method, you have to deal with a None branch. Of course
you can just unwrap and go on, but it's a developer decision to do that,
not an oversight as using a Foo|null (or ?Foo) as an object directly.