首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >辅助模式是否提供了更好的类型安全性,那么类型参数呢?

辅助模式是否提供了更好的类型安全性,那么类型参数呢?
EN

Stack Overflow用户
提问于 2021-01-28 06:02:36
回答 1查看 41关注 0票数 0

我对辅助模式进行了一些实验,发现Aux与编译器集成得更好。考虑以下两种情况:

I.

代码语言:javascript
复制
import Granularity.{Full, Partial}

sealed trait Granularity

object Granularity {

  case object Full extends Granularity

  sealed trait Partial extends Granularity {
    type GranularityKey
  }

  object Partial{
    type Aux[GK] = Partial{ type GranularityKey = GK }
  }
}

sealed trait TestBub{
  type G <: Granularity
}
object TestBub{
  type Aux[GG <: Granularity] = TestBub{ type G = GG }
  case class T1(i: Int) extends TestBub{
    type G = Full.type
  }
  case class T2[Gr](j: String) extends TestBub{
    type G = Partial.Aux[Gr]
  }

  def full[G <: Full.type](t: TestBub.Aux[G]): String = t match {
    case T1(i) => i.toString
  }
}

这段代码编译精细的,没有警告

II.

代码语言:javascript
复制
import Granularity.{Full, Partial}

sealed trait Granularity

object Granularity {

  case object Full extends Granularity

  sealed trait Partial extends Granularity {
    type GranularityKey
  }

  object Partial{
    type Aux[GK] = Partial{ type GranularityKey = GK }
  }
}

sealed trait TestBub[G <: Granularity]

object TestBub{
  case class T1(i: Int) extends TestBub[Full.type]
  case class T2[Gr](j: String) extends TestBub[Partial.Aux[Gr]]

  def full[G <: Full.type](t: TestBub[G]): String = t match {
    case T1(i) => i.toString
  }
}

此代码使用警告进行编译。

代码语言:javascript
复制
match may not be exhaustive.
It would fail on the following input: T2(_)

问题:考虑到这两种情况,Aux模式是否提供了一种更好的方式来匹配所有ADT分支的子集?

EN

回答 1

Stack Overflow用户

发布于 2021-01-28 07:25:37

这是Scala 2类型系统的另一个问题。Scala 3编译第二种情况时没有警告(正如预期的那样)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65931782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档