1

最初のタプル要素が常に Int であるリストに、さまざまなタイプのタプルを追加する方法があります。「より大きい」比較を行う必要がありますが、これは Any 型では許可されていません。以下の目的の効果を達成する方法を誰か教えてもらえますか?

ありがとうデス

private def add(list: List[Product], item: Product): List[Product] = {
  if(list.isEmpty || list.head.productElement(0) > item.productElement(0)) item :: list
  else add(list.tail, item)
}
4

2 に答える 2

1

のアリティが可変であるためにziggystarの提案を受け入れることができない場合はProducer、複雑で読みにくい可能性があるアプローチを回避するという利点を備えたリファクタリングによって、目的の効果を達成できる可能性があります。例えば:

case class Item(i: Int, item: Product)

def add(list: List[Item], item: Item): List[Item] = {
  if (list.isEmpty || list.head.i > item.i) item :: list
  else add(list.tail, item)
}

使用すると、次のようになります。

add(Nil, Item(1, (1, "b"))) // List(Item(1,(1,b)))
add(List(Item(1, (1, "a"))), Item(2, (1, "b"))) // List(Item(2,(1,b)))
add(List(Item(2, (1, "a"))), Item(1, (1, "b"))) // List(Item(1,(1,b)), Item(2,(1,a))
于 2013-03-06T16:14:12.293 に答える
0

リフレクションに頼る場合は、名義型と構造型を組み合わせて使用​​できます。

import scala.language.reflectiveCalls

// A structural type exploiting the fact that all tuples have a _1 field
type IntComponent = { val _1: Int }

def add(list: List[Product with IntComponent], item: Product with IntComponent): List[Product with IntComponent] = {
  if(list.isEmpty || list.head._1 > item._1) item :: list
  else add(list.tail, item)
}

組み合わせProduct with IntComponentは厳密には必要ありませんが、IntComponent十分です。ただし、この組み合わせにより安全性が少し高まり、Product必要に応じて によって宣言されたフィールドとメソッドを使用できるようになります。

これにより、かなりの静的型安全性が得られます。

add(Nil, (1, "foo", null)) // ok

add(Nil, ("foo", 0)) // error
  // error: type mismatch;
  //    found   : String("foo")
  //    required: Int

add(List[Product with IntComponent](Tuple1(1), Tuple2(-1, true)), (0, "yes"))
  // Explicit type annotation required, error otherwise
  //     found   : List[Product with Serializable]
  //     required: List[Product with this.IntComponent]

このアプローチの明らかな弱点は、Product with IntComponentたとえば、 である任意のオブジェクトに忍び込むことができることです。

case class FakeTupleA(_1: Int)

add(Nil, FakeTupleA(99)) // ok

要件がなければ、Product以下も機能します。

add(Nil, new FakeTupleB(99))
  // error: type mismatch;
    // found   : this.FakeTupleB
    // required: Product with this.IntComponent
于 2013-03-06T14:58:58.017 に答える