Coproduct对“密封特性”的好处?

时间:2017-01-31 03:58:08

标签: scala shapeless

我在优秀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有什么好处?

2 个答案:

答案 0 :(得分:6)

一个好处类似于使用类型类而不是继承:ad-hoc多态。您可以制作任何类型的Coproduct,即使是您无法控制的类别,例如String和Int。你不能用密封的特性来做到这一点(除非你制作了笨拙的StringHolderIntHolder案例类来包装它们。)

答案 1 :(得分:2)

与使用HList优于case class的好处相同:您可以编写适用于所有副产品的通用代码,或满足某些条件的所有副产品。然后使用Generic使相同的代码同样适用于sealed trait

相关问题