2017-04-19 20 views
4

変数が2つの型の値を持つことを可能にするscalaにはEitherがあります。複数の型を持つScala変数

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

しかし、変数xには2つ以上のタイプが必要です。 {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に今することができますパターンマッチ:

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

これは私の問題のトリックです、あなたの答えに感謝します。 –

9

型崩れcoproductsを見

"シェイプレスはCoproduct型を持ち、Scala's Eitherの一般化はですは、選択肢」あなたの正確なユースケースは、これをチェックアウトしているかわからない

+0

これはまさに私が望んでいたようですが、私は今すぐ外部ライブラリを使用することはできませんが、後でこれを検討します。 Btw、それについて知っていることは非常に役立ちます。ありがとうございました。 –

4

の任意の数:

scala type alias - how to have a type that represent multiple data typesは基本的にあなたが形質を作成するには、傘/親クラスを表します。その後、親の特性を拡張する複数のクラスを定義し、親の特性を期待されるパラメータのタイプとして関数に入れます。次に、親の特性を拡張するすべての型を渡すことができます。

サブタイプをラップする必要がありますが、複数のタイプを表す1つのタイプを持つことができます。

別の方法として、ジェネリック型と型境界を使用することができます。これらの記事は、これらの2つの科目について話:

私はまだスカラ座を学ぶが、これは役立ちます願っていますよ! :)

+0

あなたの答えは多くの情報を含んでおり、とても役に立ちます。ありがとうございました。 :) –

関連する問題