【发布时间】:2017-07-13 06:51:19
【问题描述】:
给定:
val a = "foo" :: "bar" :: MyNil[Float]()
我希望a.ArrayType 解析为Array[Array[Float]],以及a.toList 生成Seq("foo", "bar")。对于更长的列表,a.ArrayType 应该嵌套更深,但叶子类型应该保持不变。
我正在尝试定义一个允许上述操作的数据结构,但到目前为止我自己的尝试都失败了。
我有一些方法并不完全奏效。要么我没有得到感应步骤,要么感应开始。也许有一些我看不到的无形解决方案?到目前为止,这是我未能开始归纳的地方:
trait NestedArrays[A] {
type BaseType = A
type ArrayType <: Array[_]
val name: String
val t: NestedArrays[A]
def ::(name: String): ::[A] = new ::(name, this)
def toList: List[String] = name :: t.toList
}
case class ::[A](name: String, t: NestedArrays[A]) extends NestedArrays[A] {
override type BaseType = t.BaseType
override type ArrayType = Array[t.ArrayType]
}
class HANil[A] extends NestedArrays[A] {
override type BaseType = A
override type ArrayType = A
override val t: NestedArrays[A] = null
override val name: String = null
override def toList: List[String] = Nil
}
object HANil {
def apply[A](): NestedArrays[A] = new HANil[A]
// val test = "bar" :: "baz" :: "foo" :: begin[Float]("bal")
val test = "foo" :: "bar" :: HANil[Float]()
//val test = begin[Float]("boo")
val a = Array.ofDim[Float](2, 2).asInstanceOf[test.ArrayType]
}
我的其他解决方案因ArrayType 是否必须是数组而有所不同(如果不是,则归纳步骤失败,但启动有效),或者NestedArrays 是否具有类型参数,但这都是细节工作.我也会对其他方法的任何其他解决方案感到高兴,尽管我想我需要在所有解决方案中进行一些依赖于路径的输入。也许一些隐式参数可以指导我的方式?
【问题讨论】:
-
我是否正确观察到该列表仅包含
String类型的元素,并且您只需附加一个“类型标签”(float),您想使用它来参数化您的嵌套Array?所以你并没有真正的HList,但你使用“HList”只是为了计算嵌套级别? -
正确。列表中的元素越多,我想要的嵌套就越多。这不是无形的
HList,我只是想可能有一些基于HList的魔法我可以拼写。对于更多上下文:我想围绕 javaish API 创建一个类型安全层,该 API 需要围绕可以具有多维数组的数组进行强制转换,名称是用于描述数据的坐标轴的名称。 -
感谢您在 stackoverflow.com/questions/42410653/… 中更简洁地询问 shapeless :)
标签: scala types nested shapeless