我在优秀coproducts:
中阅读了以下关于Shapeless Guide的内容......值得一提的是,Coproducts并不特别特别。使用Either和Nothing代替以下功能可以实现上述功能:+: 和CNil。
以上代码:
import shapeless.{Coproduct, :+:, CNil, Inl, Inr}
case class Red()
case class Amber()
case class Green()
type Light = Red :+: Amber :+: Green :+: CNil
val red: Light = Inl(Red())
// red: Light = Inl(Red())
val green: Light = Inr(Inr(Inl(Green())))
// green: Light = Inr(Inr(Inl(Green())))
根据我自己的理解,在sealed trait
上使用Coproduct有什么好处?
答案 0 :(得分:6)
一个好处类似于使用类型类而不是继承:ad-hoc多态。您可以制作任何类型的Coproduct,即使是您无法控制的类别,例如String和Int。你不能用密封的特性来做到这一点(除非你制作了笨拙的StringHolder
和IntHolder
案例类来包装它们。)
答案 1 :(得分:2)
与使用HList
优于case class
的好处相同:您可以编写适用于所有副产品的通用代码,或满足某些条件的所有副产品。然后使用Generic
使相同的代码同样适用于sealed trait
。