2017-04-19 2 views
4

변수가 2 가지 유형의 값을 가질 수있는 스칼라에 Either이 있습니다.여러 유형의 스칼라 변수

val x: Either[String, Int] = Left("apple") 

그러나 변수 x에는 두 가지 유형이 있습니다. {String, Int, Double, List[String] }.

e.g. val x:[type can be either String, Int, Double or List[String]] 
//So that I can store either String, Int, Double, List[String] value in x. 

이 방법이 있습니까?

+0

* 변수에 2 가지 이상의 유형이 있습니다. 예를 들어 실제적으로 무엇을 의미하는지 자세히 설명해 주시겠습니까? –

+1

'어느 쪽 [[String, Int], Double], List [String]]' –

+0

@YuvalItzchakov 답변을 업데이트했습니다. –

답변

16

는 IMO이를 표현하는 가장 자연스러운 방법은 ADT (대수 데이터 형식) 작성하는 것입니다 :

sealed trait Foo 
case class Bar(s: String) extends Foo 
case class Baz(i: Int) extends Foo 
case class Fizz(d: Double) extends Foo 
case class Buzz(l: List[String]) extends Foo 

을 이제 할 수 있습니다 Foo에 패턴 일치 : 볼품 coproducts에서

val f: Foo = ??? 
f match { 
    case Bar(s) => // String 
    case Baz(i) => // Int 
    case Fizz(d) => // Double 
    case Buzz(l) => // List[String] 
} 
+0

이것은 내 문제의 트릭을 당신의 대답에 감사드립니다. –

9

"shapeless는 Coproduct 유형을 가지며, 스칼라의 일반화는 은 선택 "정확한 사용 사례가 있지만 체크 아웃 무엇 확실하지

+0

이것은 정확히 내가 원하는 것 같지만, 지금은 외부 라이브러리를 사용할 수 없지만 나중에 이것을 고려할 것입니다. Btw, 그것에 대해 알고 매우 도움이됩니다. 고맙습니다. –

4

의 임의의 수 :

scala type alias - how to have a type that represent multiple data types은 기본적으로 당신이 특성을 만들 우산/부모 클래스를 나타냅니다. 그런 다음 상위 특성을 확장하는 여러 클래스를 정의하고 부모 특성을 함수의 예상 매개 변수 유형으로 지정합니다. 그런 다음 부모 특성을 확장하는 모든 유형을 전달할 수 있습니다.

하위 유형을 줄 바꿈해야하지만 여러 유형을 나타내는 유형을 하나씩 가질 수 있습니다.

또 다른 방법으로는 제네릭 형식과 형식 경계를 사용할 수 있습니다. 이 기사는이 두 가지 주제에 대해 이야기 :

나는 아직도 스칼라를 배우는 중이에요,하지만이 도움이되기를 바랍니다! :)

+0

답변에 많은 정보가 포함되어있어 매우 유용합니다. 고맙습니다. :) –