3

私はscalaを学んでおり、最高のトレーニングとして、古いJavaアルゴリズムを関数型プログラミングスタイルに変換しています. 次のコードがあります。

def test(originalSet: Set[Int]):Boolean = originalSet match {
    case Set()  => true
    case x::y => false
  } 

このコードはリストでは正常に機能しますが、セットでは次のコンパイル エラーが発生します。

  - value Set is not a case class constructor, nor does it have an unapply/unapplySeq 
         method

- constructor cannot be instantiated to expected type; found : scala.collection.immutable.::[B] required: 
     scala.collection.immutable.Set[Int]
    - constructor cannot be instantiated to expected type; found : scala.collection.immutable.::[B] required: 
     scala.collection.immutable.Set[Int]

何が問題ですか?Set が空の場合をテストするにはどうすればよいですか? セットに頭と尻尾がある場合、どうすれば他のケースにできますか?

4

3 に答える 3

3

この質問はちょっと古いですが、どの回答もパターンマッチを可能にする解決策を提供していないことに驚いています。

セマンティクスを維持し、パターン マッチを可能にするには、 for 入力を受け取るカスタムメソッドSetを実装する必要があります。これは、ほぼすべてのタイプに適用できる非常に便利なパターンです。unapplySet

object EmptySet {
  def unapply[A](s: Set[A]): Boolean = s.isEmtpy
}

object NonEmptySet {
  def unapply[A](s: Set[A]): Option[Set[A]] = 
    if (s.isEmpty) None
    else Some(s)
}

def foo(bars: Set[Int]): String = bars match {
  case EmptySet => "No Bars"
  case NonEmptySet(values) => s"Bars: $values"
}

パターンはここで説明されています: http://docs.scala-lang.org/tutorials/tour/extractor-objects.html

于 2016-04-21T17:57:38.593 に答える
2

Set には unapply メソッドも Seq もありません。(ref Scala Pattern Matching with Sets ) ..しかし、私自身のメモを追加します。私はscalaを学んでおり、最初はすべてに大文字と小文字の一致を使用する必要があると考えていましたが、関数型プログラミングで if-then ステートメントを使用することは完全に受け入れられます。 、そしてここで最も理にかなっています。

def test(originalSet: Set[Int]):Boolean = ! originalSet.isEmpty
于 2013-09-08T20:08:38.547 に答える