2017-01-31 1 views
4

나는 우수한 Shapeless Guide에서 다음에 대한 coproducts을 읽어'봉인 된 특성'에 따른 복합 제품의 이점?

... 그것은 로서도 특히 특별하지 않은한다는 가치가있다. 위의 기능은 + : 및 CNil 대신에 Either 및 Nothing을 사용하여 수행 할 수 있습니다. 있는 경우, 이익이 sealed trait를 통해 부산물 (Coproduct)를 사용하는, 무엇인가 내 자신의 이해를 돕기 위하여

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()))) 

:

여기에 위의 코드인가?

+0

구현 사례 클래스를 숨기려면 봉인 된 특성을 사용합니다. 예 : 구현 클래스를 컴패니언 객체에 넣고 비공개로 만듭니다. 타입 시스템을 어지럽히는데 아무런 의미가 없습니다. –

+0

또한 레드가 라이트를 연장합니까? 봉인 된 특성으로 계층 구조를 피하려면 + :를 사용할 수 있습니다. –

답변

6

하나의 이점은 상속이 아닌 형식 클래스를 사용하는 이점과 유사합니다 : ad-hoc 다형성. 어떤 유형의 제품도 만들 수 있습니다. 문자열 및 Int. 봉인 된 특성으로는이 작업을 수행 할 수 없습니다 (포장하려면 StringHolderIntHolder 사례 클래스를 사용하지 않는 한).

2

case class에 대해 HList을 사용하는 이점과 동일합니다. 모든 공동 제품 또는 일부 조건을 충족하는 모든 공동 제품에 사용할 수있는 일반 코드를 작성할 수 있습니다. 그리고 나서 Generic을 사용하여 동일한 코드가 sealed trait과 함께 작동하도록합니다.

+0

그러나'A'가 사례 클래스 인'Generic [A]'를 사용하여 모든 사례 클래스에 대해'HList'를 얻을 수 없습니까? –

+0

예, 정확하게. 봉인 된 형질에'Generic [A]'를 적용하면'Coproduct'가 생깁니다. –

관련 문제