Ceylon 1.0 のリリースに伴い、一部の人々は共用体型の有用性について議論しています。次のコードをどれだけ簡潔に記述できるか疑問に思っていました。
String test(String | Integer x) {
if (x is String) {
return "found string";
} else if (x is Integer) {
return "found int";
}
return "why is this line needed?";
}
print(test("foo bar")); // generates 'timeout'... well, whatever
...Scalaで?私の考えは次のようなものでした:
type | [+A, +B] = Either[A, B]
object is {
def unapply[A](or: Or[A]): Option[A] = or.toOption
object Or {
implicit def left[A](either: Either[A, Any]): Or[A] = new Or[A] {
def toOption = either.left.toOption
}
implicit def right[A](either: Either[Any, A]): Or[A] = new Or[A] {
def toOption = either.right.toOption
}
}
sealed trait Or[A] { def toOption: Option[A] }
}
def test(x: String | Int) = x match {
case is[String](s) => "found string" // doesn't compile
case is[Int ](i) => "found int"
}
しかし、パターン エクストラクタはコンパイルされません。何か案は?
同様の質問がいくつかの有効な回答とともに存在することは知っていますが、特に、Either
および抽出子の型エイリアスを使用できるかどうかは疑問です。以外の新しい型クラスを定義したとしてもEither
、ソリューションは徹底的なパターン マッチを可能にする必要があります。