Skip to content

Instantly share code, notes, and snippets.

@MikuroXina
Created October 26, 2025 16:20
Show Gist options
  • Select an option

  • Save MikuroXina/0ed6bae7965c6d5688d25a225db68089 to your computer and use it in GitHub Desktop.

Select an option

Save MikuroXina/0ed6bae7965c6d5688d25a225db68089 to your computer and use it in GitHub Desktop.
An incomplete experiment of Option (Maybe) monad in Go language.
package main
type OptionHandlers[T any, R any] struct {
OnSome func(value T) R
OnNone func() R
}
type Option[T any] func(handlers OptionHandlers[T, any]) any
func Some[T any](value T) Option[T] {
return func(handlers OptionHandlers[T, any]) any {
return handlers.OnSome(value)
}
}
func None[T any]() Option[T] {
return func(handlers OptionHandlers[T, any]) any {
return handlers.OnNone()
}
}
func (o Option[T]) Unwrap() T {
return (o)(OptionHandlers[T, any]{
func(value T) any {
return value
},
func() any {
panic("unwrapped None")
},
}).(T)
}
func (o Option[T]) UnwrapOr(def T) T {
return (o)(OptionHandlers[T, any]{
func(value T) any {
return value
},
func() any {
return def
},
}).(T)
}
func (o Option[T]) Map(mapper func(value T) T) Option[T] {
return (o)(OptionHandlers[T, any]{
func(value T) any {
return Some(mapper(value))
},
func() any {
return None[T]()
},
}).(Option[T])
}
func main() {
opt := Some("foo")
opt2 := opt.Map(func(s string) string {
return s + "!"
}).UnwrapOr("")
println(opt2)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment