Any reason why backed enums are limited to int and string only?

php.internals

Olle Härstedt

5 years ago
Hello, 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 Olle

Rowan Collins

5 years ago
On 31/03/2021 19:44, Olle Härstedt wrote:
> enum Result: mixed { > case Ok = null; > case Error = null; > }
Sounds like what you're looking for is not "pure" enums, but Algebraic Data Types. Larry and Ilija have a grand plan for adding those, but there's a few steps to go yet: https://wiki.php.net/rfc/adts The current enum values are just constants for simplifying serialization and lookup (translating to a code or database ID). Regards,
-- Rowan Tommins [IMSoP]

Ilija Tovilo

5 years ago
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

Olle Härstedt

5 years ago
2021-03-31 20:52 GMT+02:00, Ilija Tovilo <tovilo.ilija@gmail.com>:
> 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 > >
Got it, thanks guys! Olle