我在优秀的Shapeless指南链接中读到了关于余积类型的以下内容:
... 值得说明的是,余积类型并不特别。可以使用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())))
为了我自己的理解,使用Coproduct相对于使用sealed trait
有什么好处(如果有的话)?