将 Option、Some 和 None 密封类型重命名为特定领域的语言?

Renaming the Option, Some, and None sealed types to a domain-specific language?

我想声明一些类型 ,它们是 OptionSomeNone,但被 不同的名称 更适合我的领域,以提高代码的可读性。因为尽管 Option 的功能确实将 1:1 映射到我的问题域,但乍一看并不十分明显,因此将此类型称为“选项”会造成混淆。

我的第一个想法是使用类型别名:

type Foo[T] = Option[T]
type Bar[T] = Some[T]
type Bash = None.type

但是,我无法在模式匹配时使用这种新的“语言”:

def example(f: Foo[Int]) = f match {
  case Bar(_) => "got bar"
  case Bash => "got bash"
}
/*
On line 2: error: not found: value Bar
         case Bash => "got bash"
              ^
On line 3: error: not found: value Bash
       Identifiers that begin with uppercase are not pattern variables but match the value in scope.
*/

接下来我想到了简单的子类化,但是 Option 是密封的——有充分的理由——所以这是不可能的:

trait Foo[T] extends Option[T]
// error: illegal inheritance from sealed class Option

最后,我认为我在尝试 导入时重命名 很聪明:

// BEGIN Foo.scala
import scala.{Option => Foo}
import scala.{Some => Bar}
import scala.{None => Bash}

// This works!
def example(f: Foo[Int]) = f match {
  case Bar(_) => "got bar"
  case Bash => "got bash"
}

...但是无法导出新声明的名称以在当前文件之外使用:

// BEGIN OtherFileThatUsesFoo.scala

// Doesn't compile because Option must be called either "Option" or "Foo" and not both
case class Person(child: Option[Person], foo: Foo[Int]) 

除了用不同的名称简单地实施 Option 之外,我还缺少其他选择吗?

@Luis Miguel Mejía Suárez 在评论中有它!

type Foo[T] = Option[T]
val Foo = Option
type Bar[T] = Some[T]
val Bar = Some
type Bash = None.type
val Bash = None

// Compiles and runs correctly!
def example(f: Foo[Int]) = f match {
  case Bar(_) => "got bar"
  case Bash => "got bash"
}

我还需要为伴随对象“别名”,la val Foo = Option