gpt4 book ai didi

scala - 如何避免丢失类型信息

转载 作者:行者123 更新时间:2023-12-04 14:44:40 26 4
gpt4 key购买 nike

假设我有这样的事情:

trait Cursor {
}

trait Column[T] {
def read(cusor: Cursor): T
}

trait ColumnReader {
def readColumns(columns: Product[Column[_]], cursor: Cursor): Iterable[Any] = {
for (column <- columns) yield column.read(cursor)
}
}
readColumns()的问题API 是我丢失了类型信息,即,如果我有这个:
object columnString extends Column[String] {
def read(cursor: Cursor): String = ...
}

object columnInt extends Column[Int] {
def read(cursor: Cursor): Int = ...
}

类似 new ColumnReader().readColumns((columnString, columnInt)) 的表达式返回 Iterable[Any] .我想返回类似 Tuple2[String, Int] 的内容,但不知道如何。我丢失了对编译器有用的类型信息。

也许像 Shapeless 这样的图书馆可能有用。

我确信 Scala 有一些工具可以处理这样的问题。

有任何想法吗?

最佳答案

使用无形状 HList 的示例

class Cursor

trait Column[T] {
def read(cusor: Cursor): T
}

class CursorContainer(cursor: Cursor) {
object mapper extends Poly1 {
implicit def any[T] = at[Column[T]](_.read(cursor))
}
}

class ColumnReader {

def readColumns[T <: HList](columns: T, cursor: CursorContainer)(
implicit m:Mapper[cursor.mapper.type, T]) = columns.map(cursor.mapper)
}

val columnString = new Column[String] {
def read(cursor: Cursor): String = ???
}

val columnInt = new Column[Int] {
def read(cursor: Cursor): Int = ???
}

val reader = new ColumnReader
val cursor = new CursorContainer(new Cursor)
val result: String :: Int :: HNil =
reader.readColumns(columnString :: columnInt :: HNil, cursor)

关于scala - 如何避免丢失类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25010860/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com