繁体   English   中英

扩展空特征时,对空特征使用类型参数的目的是什么?

[英]What is the purpose of using type parameters for an empty trait when extending it?

我最近遇到了一个类似于以下代码的代码。

我想问的问题是,由case类扩展时指定的Second的类型参数(即第一个类型参数)的可能目的是什么。

我看不到使用AOption[A]Seq[A]任何特殊原因,因为扩展案例类通过[A <: SomeTrait, B <: AnotherTrait]缩小了类型参数的范围。

我是否缺少任何要点?

sealed trait Top[A, B]

sealed trait Second[A, B] extends Top[A, B]

case class ThirdA[A <: SomeTrait, B <: AnotherTrait](
  returnType: Class[A], 
  relation: B
) extends Second[A, B]

case class ThirdB[A <: SomeTrait, B <: AnotherTrait](
  returnType: Class[A],
  relation: B
) extends Second[Option[A], B]

case class ThirdC[A <: SomeTrait, B <: AnotherTrait](
  returnType: Class[A],
  relation: B
) extends Second[Seq[A], B]

遵循你的逻辑

我的意思是类型参数AOption[A]Seq[A]在这里试图实现(强制执行)什么? 我的理解是,只要Second为空,在这里使用Only A是相同的。

标准 GADT

//  data Lam :: * -> * where
//    Lift :: a                     -> Lam a        -- ^ lifted value
//    Pair :: Lam a -> Lam b        -> Lam (a, b)   -- ^ product
//    Lam  :: (Lam a -> Lam b)      -> Lam (a -> b) -- ^ lambda abstraction
//    App  :: Lam (a -> b) -> Lam a -> Lam b        -- ^ function application
//    Fix  :: Lam (a -> a)          -> Lam a        -- ^ fixed point

  sealed trait Lam[A]
  case class Lift[A](a: A) extends Lam[A]
  case class Pair[A, B](la: Lam[A], lb: Lam[B]) extends Lam[(A, B)]
  case class LamC[A, B](f: Lam[A] => Lam[B]) extends Lam[A => B]
  case class App[A, B](f: Lam[A => B], la: Lam[A]) extends Lam[B]
  case class Fix[A](f: Lam[A => A]) extends Lam[A]

没有意义,因为可以将Lift[A]用作new Lam[A] {} ,将Pair[A, B]用作new Lam[(A, B)] {} ,将LamC[A, B]用作new Lam[A => B] ,将App[A, B]用作new Lam[B] {} ,将Fix[A]用作new Lam[A] {} ,并且App[X, A]Fix[A]相同Fix[A] :)

好吧,是的,但是首先可以获得具有不同对象的那些类型的对象。 对于Lam[A]您需要一个A ;对于Pair[A, B]您需要Lam[A]Lam[B]等。

同样,是的, ThirdB[A, B]ThirdA[Option[A], B]ThirdCThirdA[Seq[A], B] 但是要拥有这些类型的对象,首先需要具有不同的对象。 为了具有ThirdA[A, B]您需要类型为Class[A]B ,为了具有ThirdB[A, B]ThirdA[Option[A], B]您需要类型为Class[Option[A]] ThirdA[Option[A], B]对象Class[Option[A]]B但是您可以仅通过Class[A]B直接拥有ThirdB[A, B] ,为了通过ThirdA[Seq[A], B]获得ThirdC[A, B] ThirdA[Seq[A], B]您需要对象类型Class[Seq[A]]B但是您可以直接通过Class[A]B获得ThirdC[A, B]

例如,您可以在ThirdAThirdBThirdC上进行匹配,并根据类型编写一些逻辑。 因此,您可以为OptionSeq指定常规逻辑。

所以实际上这取决于SomeTraitAnotherTraitClass是什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM