将 Option、Some 和 None 密封类型重命名为特定领域的语言?
Renaming the Option, Some, and None sealed types to a domain-specific language?
我想声明一些类型 ,它们是 Option
、Some
和 None
,但被 不同的名称 更适合我的领域,以提高代码的可读性。因为尽管 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
。
我想声明一些类型 ,它们是 Option
、Some
和 None
,但被 不同的名称 更适合我的领域,以提高代码的可读性。因为尽管 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
。