Hi Olle

> I was trying to implement the result type from OCaml using enums, and
> noticed that they can only carry int or string data, not arbitrary
> data. Any specific reason for this?
>
> Example:
>
>     enum Result: mixed {
>         case Ok = null;
>         case Error = null;
>     }
>
> Error with:
>
> Fatal error: Enum backing type must be int or string, mixed given in
> /tmp/enum.php on line 3
>
> More specifically, for this idiom to work, "Ok" needs to be mixed and
> "Error" should be string.
>
> OCaml idiom: https://ocaml.org/learn/tutorials/error_handling.html#Result-type

What you're trying to achieve here is not what backed enums are for.
Backed enums are for assigning each enum case a single, constant
representation that can be converted back and forth. As for Result,
what you'd want here is a dynamic, arbitrary value for both Ok and
Error, which is exactly what ADTs / tagged unions would allow you to
do:

https://wiki.php.net/rfc/tagged_unions

enum Result
{
    case Ok(mixed $result);
    case Error(mixed $error);
}

Optimally we'd define Result as "Result<TOk, TError>" but that's
another discussion :)

Note that work on ADT hasn't started yet.

Ilija

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to