基本的な概念上の理由から、これは不可能だと思います。型ルールはコンパイル時にチェックされるため、実行時まで不明な値に基づいて型を派生させることはできません。
そうは言っても、それぞれが特定の型の値のラッパーであるケースクラスのファミリーを定義することで、設計上の問題に取り組むことができるかもしれません。これらのクラスに共通の基底クラスを与えることで、任意の型の値を同じ変数に格納し、型安全なパターン マッチングによって抽出できます。
class Base
case class AString(val value: String) extends Base
case class AnInt(val value: Int) extends Base
case class ADouble(val value: Double) extends Base
val a : Base = "value1" match {
case "value0" => AString(…)
case "value1" => AnInt(…)
case "value0" => ADouble(…)
}
a match {
case AString(s) => …
case AnInt(i) => …
case ADouble(i) => …
…
}