Scalaの型システムにはあまりよく慣れていませんが、ここで私がしようとしていることがあります。Scalaのコンテナ代数データ型
私は姓と名で人をフィルタリングしようとする機能を持っていますが、それが最初の名前だけでフィルタに失敗するとします。
case class Person(id: Int, first: String, last:String)
def(people: Set[Person], firstName: String, lastName: String): (MatchResult, Set[Person]) =
val (both, firstOnly) = people.filter(_.first == firstName).partition(_.last == lastName)
(both.nonEmpty, firstOnly.nonEmpty) match {
case (true, _) => (BothMatch, both)
case (false, true) => (FirstOnly, firstOnly)
case (_, _) => (NoMatch, Set[Person]())
}
は、今私は、フィルタの結果を使用した発信者を知らせる代数的データ型と一緒にフィルタリングSet
を返しています。
sealed trait MatchResult
case object BothMatch extends MatchResult
case object FirstOnly extends MatchResult
case object NoMatch extends MatchResult
しかし、呼び出し側のための非常に素晴らしい契約を提示していないSet
+ MatchResult
のタプルを返します。私はフィルタリングされた結果をどのように保存することができますか私のMatchResult
。
は、私は単にに変えることができると思った:
sealed trait MatchResult extends Set[People]
case object BothMatch extends MatchResult
case object FirstOnly extends MatchResult
case object NoMatch extends MatchResult
しかし、コンパイラは、私はSet
を延長するか、何とかMatchResult
case class
を作ってみる必要がある場合、私はmust implement abstract member iterator: Iterator[A]
私はよく分からないことを私に伝えていますコンストラクタ引数としてセットを受け取ります。
これは私が必要なものを正確である、ことでこれらのクラスを使用することができます - あなたに感謝! – diplosaurus