1

私は以前の質問をしましたが、それに対して私は素晴らしい答えを受け取りました。コメントの中で、Travisは、2つHandValueのを比較することは直接機能しないが、パターンマッチングを使用して、同じクラスを確実に比較できると述べました。

  sealed abstract class HandValue[T <: HandValue[T]](val rank: Int) extends Ordered[T]
  case class HighCard(high: Int) extends HandValue[HighCard](0){
    def compare(that: HighCard) = this.high - that.high
  }

  case class TwoPair(high: Int, big: Int, sm: Int) extends HandValue[TwoPair](2) {
    def compare (that: TwoPair) = { ... }
  }

以下のパターンマッチングの試行では、コンパイル時エラーが発生しました。これは、の使用に関係していると思われますHandValue[_]val h1: HandValue[T <: HandValue[T]]、型が宣言された方法と同様に、無効です。これらを解決する方法はありますか?

  val ans = sessions count {
    hands: (Hand, Hand) => {
      val h1: HandValue[_] = handValue(hands._1)
      val h2: HandValue[_] = handValue(hands._2)
      (h1, h2) match { // <-- Line as source of error
        case _ if h1.rank > h2.rank => true
        case (a: HighCard, b: HighCard) => a > b
        case (a: TwoPair, b: TwoPair) => a > b
        // etc..
      }
    }
  }

編集:コンパイル時のエラーは次のとおりです。

error: type arguments [_$3] do not conform to class HandValue's type parameter bounds [T <: euler.solutions.p54.HandValue[T]]
(h1, h2) match {

編集2:この質問で述べたように、使用Type[_]は機能しません。

4

1 に答える 1

2

エラーを解決することはできませんが、HandValueany を他のものと比較できるようにすることで、この複雑さの多くを取り除くことができHandValueます。そうすれば、その恐ろしいパラメータ化と繰り返しcompareメソッドを使用する必要がなくなり、その後に で繰り返される比較ロジックが続きansます。

1 つの方法は、それぞれに を定義させることstrengthです。これはSeq[Int]、ハンド ランクと、それに続くハンド内のカードのランクで構成され、その強さを定義します。次に、これらを比較Seqsして、最初に来る数字が大きい方を見つけます。

sealed abstract class HandValue(val strength: Seq[Int]) extends Ordered[HandValue] {
  import math.Ordering.Implicits.seqDerivedOrdering
  def compare(that: HandValue) = 
    Ordering[Seq[Int]].compare(this.strength, that.strength)
}

case class HighCard(high1: Int, high2: Int, high3: Int, high4: Int, high5: Int ) 
  extends HandValue(Seq(0, high1, high2, high3, high4, high5))

case class TwoPair(high: Int, big: Int, sm: Int) 
  extends HandValue(Seq(2, big, sm, high))

val ans = sessions count { hands => 
  handValue(hands._1) > handValue(hands._2)
}

高いカード ハンドの強さを計算するときは、すべてのカードを考慮する必要があることに注意してください。エースから 5 へのストレートにも注目してください。

strengthまた、ハッシュ関数を使用してを計算することもできIntます (この問題を行ったときに行ったように: https://gist.github.com/3270831 )。

于 2012-08-06T05:19:00.440 に答える