A concrete example of an "Optional" implementation in present in the sql
package:
https://golang.org/src/database/sql/sql.go?s=4943:5036#L178

In SQL, it's common to have "null" values be distinct from zero values, so
the DB package has a struct with the value and a flag whether the value was
present.

As others have said, you can already build this, it's just not part of
built in language syntax.

-- Marcin

On Fri, Oct 23, 2020 at 4:15 AM Jesper Louis Andersen <
jesper.louis.ander...@gmail.com> wrote:

> On Fri, Oct 23, 2020 at 12:17 AM Ian Lance Taylor <i...@golang.org> wrote:
>
>> So there are several possible approaches.  I'm guessing you want one
>> that is more implicit, but as a general guideline Go tends to prefer
>> explicit code.
>>
>>
> I don't think there is a good implicit approach to this problem. If you
> have a value that is optional, it has to be modeled as such in your system.
> The `*bool` representation is precise: `nil` maps to the bottom of the
> domain, and `true`/`false` maps to the values of the domain. The only way
> to work with such a type is to match on it to determine if the pointer is
> nil, followed by inspection of the boolean value. Generally, optional
> values need somewhere in the program where they are scrutinized, and you
> can't avoid that scrutiny. You can try to hide it with some clever implicit
> construction, but that is very likely to lead to subtle errors in programs.
> People might want to treat `nil` as an exception case, but it really isn't.
> It is a value like any other value, and should be treated as such in the
> program.
>
> The approach taken by e.g., OCaml is that there is no `nil` in the
> language at all. Rather, there is a `'a ref` type, but that cannot be
> initialized to be `nil`. It always references something valid. You can then
> mint your own `nil` by means of an option type:
>
> type 'a option = None | Some of 'a
>
> However, the underlying representation is much akin to that of a typical
> pointer value. What has this gained us? Well, we can now create
>
> type 'a option2 = None2 | Some2 of 'a
>
> for instance. This type is *different* from the first one, yet has the
> same underlying representation. Thus, we can avoid a problem in the Go
> `*bool` solution: namely conflation of pointer representations with
> optional values; we simply mint a new type. I think this is more explicit
> and more precise in representation. And it's solution would work well for
> the originally proposed case.
>
> As an aside, this leads to an important design point: if pointers are used
> as optional values (and not for the sake of sharing/optimization) stripping
> away the pointer often leads to code that is easier to work with since you
> avoid that pesky nil-check all over the place and can do with it in one
> place. Also, the astute reader might have caught on to the fact that the
> same observation holds true for error values, which in OCaml are defined as:
>
> type 'a err = Err of 'a
> type ('a, 'b) result = Err of 'a | Ok of 'b
>
> If we now recognize there is a unit type with one inhabitant, you can see
> that an `'a option` is really just a `(unit, 'b) result`. That is, there is
> a good type-theoretic reason for your observation.
>
>
>
>
>
> --
> J.
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/CAGrdgiWjsL-hyp3%2Bch8aRaHFxiFqZekbcHPVcftV7SpXLMiCeQ%40mail.gmail.com
> <https://groups.google.com/d/msgid/golang-nuts/CAGrdgiWjsL-hyp3%2Bch8aRaHFxiFqZekbcHPVcftV7SpXLMiCeQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CA%2Bv29Lsje3YFd7kZn5e_c1U%3DVS9upzVyTu5bYe1Em9XnHr9sTw%40mail.gmail.com.

Reply via email to