top | item 31151300

(no title)

Kostarrr | 3 years ago

I don’t think the Option presented here is sufficient (it is indeed a “crime”) as you cannot express Some(nil).

But you could probably achieve that using go's not-well-known sum types, e.g. like this

https://github.com/FSMaxB/type-safe-builder-experiment/blob/...

discuss

order

tsimionescu|3 years ago

Well, that doesn't really work, as "StaticOptional[T]" can't be used as the type of a variable. It can only be used to create another generic function.

For example, this doesn't work [0]:

  //compilation error: interface contains type constraints
  func TryParse123(s string) StaticOptional[int] {
     if s == "123" {
       return StaticSome[int]{123}
     }
     return StaticNone{}
  }
[0] https://go.dev/play/p/1CnieCLqESC

jchw|3 years ago

I’m pretty sure that’s an interface union, not a sum type. That said, you could definitely do an option type using interfaces, but it would be less efficient than pointers directly because of the itab overhead.

tsimionescu|3 years ago

> I’m pretty sure that’s an interface union, not a sum type.

It's a kind of sum type, but it can only be used to constrain types for a generic parameter.

That is, you can define `func foo[T StaticOptional[int]](x T)` and then call it as `foo(StaticNone{})` or `foo(StaticSome[int]{123})`, but you can't do `func foo() StaticOptional[int]` or even `func foo[T StaticOptional[int]]() T {return StaticNone{} }`.

dolmen|3 years ago

You can store nil in an Option[any] or in any pointer type such as Option[*int].