Coproduct对"密封特性"的好处?

Kev*_*ith 5 scala shapeless

我在优秀的无形指南中阅读了以下关于副产品内容:

...值得一提的是,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())))
Run Code Online (Sandbox Code Playgroud)

根据我自己的理解,使用Coproduct而不是sealed trait?的好处是什么?

Chr*_*s B 6

一个好处类似于使用类型类而不是继承:ad-hoc多态.您可以使用任何类型的Coproduct,甚至是您控制范围之外的Coproduct,例如String和Int.你不能用密封的特性做到这一点(除非你做了尴尬StringHolderIntHolder案例类来包装它们).