2

ある種の変数があり、コンパニオン オブジェクトから情報を取得したいと考えています。たとえば、次のようなことができるのではないかと考えました。

def foo[I: Integral](i:I): = {
  val minVal = i match {
    case _:Byte  => Byte.MinValue
    case _:Char  => Char.MinValue
    case _:Int   => Int.MinValue
    case _:Long  => Long.MinValue
    case _:Short => Short.MinValue
  }
  // compare i and minVal
}

しかし、これはかなり冗長であり、 との比較minVal:Long複雑になりi: Iます。

簡潔で直接的な何かを見つけたいと思っていましたが、これには熟考が必要であると思われますが、それはしばしばどちらでもありません.

4

1 に答える 1

4

型クラスを使用して最小値を取得できます。

trait MinValue[T] { def minValue: T }
object MinValue {
  implicit val minByte = new MinValue[Byte] { def minValue = Byte.MinValue }
  implicit val minChar = new MinValue[Char] { def minValue = Char.MinValue }
  implicit val minLong = new MinValue[Long] { def minValue = Long.MinValue }
  implicit val minInt  = new MinValue[Int]  { def minValue = Int.MinValue }
}

この型クラスを使用して、foo関数に渡される値の型の最小値を取得できます。

def foo[I: Integral](i: I)(implicit min: MinValue[I]) = 
  implicitly[Integral[I]].compare(i, min.minValue)
// or 
def foo2[I: Integral: MinValue](i: I) = {
  val minVal = implicitly[MinValue[I]].minValue
  implicitly[Integral[I]].compare(i, minVal)
}

foo(5) // Int = 1
foo(Int.MinValue) // Int = 0

foo2(-127.toByte) // Int = 1
foo2(-128.toByte) // Int = 0
于 2015-10-13T21:28:58.490 に答える