scala元组类型组成

时间:2012-03-30 17:44:13

标签: scala types

给定元组类型

type T = (String, Int, String)

我有什么方法可以获得T1类型,其中T1将是

type T1 = (MyClass, String, Int, String)

我希望能够宣布像

这样的课程
class TupleTypes[T] extends AnotherClass[T1]

注意:元组大小未知且

type T1 = (MyClass, T)

将不会返回我想要的内容,它将返回(MyClass,(String,Int,String)),这是不同的。

由于

3 个答案:

答案 0 :(得分:9)

您可以使用HList来转换来自shapeless的转化。

scala> import shapeless._ ; import Tuples._
import shapeless._
import Tuples._

scala> class MyClass ; val m = new MyClass
defined class MyClass
m: MyClass = MyClass@3859023a

scala> val t1 = ("foo", 23, "bar")
t1: (String, Int, String) = (foo,23,bar)

scala> val t2 = (m :: t1.hlisted) tupled
t2: (MyClass, String, Int, String) = (MyClass@3859023a,foo,23,bar)

答案 1 :(得分:5)

在我看来,元组没有这样的构造,但 HList 的行为与你展示的行为非常相似。它们被认为具有高级类型编程结构,根据您想要实现的目标,使用可能很困难。这是excellent starternice implementation

答案 2 :(得分:1)

派对迟到了,但如果您正在寻求关于ScalaQuery问题的“更好”解决方案,请尝试以下方法:

1)创建ID为

的mapper基类
import org.scalaquery.ql.extended.{ExtendedTable => Table}

abstract class Mapper[T](table: String) extends Table[T](None, table) {
  def id = column[Int]("id", O PrimaryKey)
}

2)使用case class / companion object 扩展mapper base (即不是基于元组的)

case class Foo (bar: String)
object Foos extends _Mapper[Foo]("foo") {
  def foo = column[String]("foo")
}

然后你可以做类似的事情:

def show: List[Foo] = {
  val q = (for { f <- Foos } yield f)

  val foos = db withSession {
    foos.list map { case t:T => t }
  }
  render(foos)
}

并有一个可导航的对象(与基于索引的元组相比)。

现在,当您只需要来自一组实体的字段子集时,有时您不需要庞大的对象图。

这就是投影的来源,只需创建一个表示您想要的字段集的案例类,瞧,可以使用的可导航投影对象:

case class Yum (foo: String, baz: String)

def show: List[Yum] = {
  val q = (for { f <- Foos; b <- Bars; if f.id is b.fooID } yield (f.foo, b.baz))

  val yums = db withSession {
    yums.list map { case t:T => t }
  }
  render(yums)
}
相当简单,应该用蛋糕驱动DAO封装,但一般原则是:采取案例类/对象路径。

应该注意到ScalaQuery踢出令人难以置信的声音,Zeiger非常出色! (和Scala社区中的许多人一样,未来在Scala方式上看起来很明亮; - ))