[英]What is the purpose of using type parameters for an empty trait when extending it?
我最近遇到了一个类似于以下代码的代码。
我想问的问题是,由case类扩展时指定的Second的类型参数(即第一个类型参数)的可能目的是什么。
我看不到使用A
, Option[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]
遵循你的逻辑
我的意思是类型参数
A
,Option[A]
和Seq[A]
在这里试图实现(强制执行)什么? 我的理解是,只要Second
为空,在这里使用OnlyA
是相同的。
本标准 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]
, ThirdC
是ThirdA[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]
。
例如,您可以在ThirdA
, ThirdB
, ThirdC
上进行匹配,并根据类型编写一些逻辑。 因此,您可以为Option
和Seq
指定常规逻辑。
所以实际上这取决于SomeTrait
, AnotherTrait
和Class
是什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.