[Libguestfs] [PATCH libnbd v2 2/4] generator: Check that more parameters are not NULL
Richard W.M. Jones
rjones at redhat.com
Thu Sep 29 10:01:26 UTC 2022
On Thu, Sep 29, 2022 at 10:58:36AM +0100, Richard W.M. Jones wrote:
> It seems to be possible with phantom types & GADTs which are a very
> dark corner of OCaml and one which we shouldn't use, but here's how:
>
> ----------------------------------------------------------------------
>
> type nullable
> type not_nullable
Probably would have been better if I'd called those phantom types
"primitive" and "boxed" :-)
Rich.
> type _ arg =
> | Char : not_nullable arg
> | Int : not_nullable arg
> | String : nullable arg
> | List : nullable arg
>
> (*
> # Char ;;
> - : not_nullable arg = Char
> # String ;;
> - : nullable arg = String
> *)
>
> let only_for_nullables = function
> | String -> "do something"
> | List -> "do something else"
> | not_nullable -> .
> (* val only_for_nullables : nullable arg -> string = <fun> *)
>
> ----------------------------------------------------------------------
>
> Notes:
>
> (1) The “| not_nullable -> .” line can be omitted. It's just there to
> document the unreachable case, but (in this case) the compiler can
> infer this.
>
> (2) If you omit either of the “| String“ or “| List“ cases then the
> compile will warn about incomplete matching, which is good.
>
> Extending the example further, you can see how GADTs make the common
> case (second one below) possible, but harder to write:
>
> ----------------------------------------------------------------------
> # let only_not_nullables = function | Char -> "char" | Int -> "int" ;;
> val only_not_nullables : not_nullable arg -> string = <fun>
>
> # let all : type a. a arg -> string = function
> | Char -> "char"
> | Int -> "int"
> | String -> "string"
> | List -> "list";;
> val all : 'a arg -> string = <fun>
> ----------------------------------------------------------------------
>
> Rich.
>
> --
> Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
> Read my programming and virtualization blog: http://rwmj.wordpress.com
> nbdkit - Flexible, fast NBD server with plugins
> https://gitlab.com/nbdkit/nbdkit
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html
More information about the Libguestfs
mailing list