Scala 以类似HList的样式生成嵌套数据结构
鉴于: 我希望Scala 以类似HList的样式生成嵌套数据结构,scala,types,nested,shapeless,Scala,Types,Nested,Shapeless,鉴于: 我希望a.ArrayType解析为Array[Array[Float]],以及a.toList生成Seq(“foo”,“bar”)。对于较长的列表,a.ArrayType应该嵌套得更深,但叶类型应该保持不变 我正试图定义一个允许上述操作的数据结构,但到目前为止,我自己的尝试失败了 我有一些方法并不完全有效。要么我没能完成导入步骤,要么就是导入启动。也许有一些无形的解决方案,我没有看到?这就是我迄今为止未能启动入职培训的原因: val a = "foo" :: "bar" :: MyNil
a.ArrayType
解析为Array[Array[Float]]
,以及a.toList
生成Seq(“foo”,“bar”)
。对于较长的列表,a.ArrayType
应该嵌套得更深,但叶类型应该保持不变
我正试图定义一个允许上述操作的数据结构,但到目前为止,我自己的尝试失败了
我有一些方法并不完全有效。要么我没能完成导入步骤,要么就是导入启动。也许有一些无形的解决方案,我没有看到?这就是我迄今为止未能启动入职培训的原因:
val a = "foo" :: "bar" :: MyNil[Float]()
trait嵌套阵列[A]{
类型BaseType=A
类型ArrayType我是否正确地观察到该列表只包含类型字符串的元素,并且您只需附加一个“类型标记”(Float
)即可用于参数化嵌套数组?因此,您实际上没有HList
,而使用“HList
”仅用于计算嵌套级别
下面的代码可以通过调用step
函数来构建嵌套数组。添加名称应该很简单
我是否正确地观察到列表中只包含类型为String
的元素,并且您只需附加一个“类型标记”(float
),您想使用它来参数化嵌套的数组
?因此您实际上没有HList
,而是使用了“HList
”仅仅是为了计算嵌套级别?正确。列表中的元素越多,我想要的嵌套就越多。它不是一个不成形的HList
,我只是想可能会有一些基于HList
的魔法,我可以拼出来。更详细一点:我想在javaish API周围创建一个类型安全层,需要对数组进行强制转换可以有多维数组,名称是用于描述数据的坐标轴的名称。感谢您在关于shapeless中提出更简洁的问题:)
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]
}
trait I {
type Out
def step: I.Aux[Array[Out]] = I[Array[Out]]
def create(x: Any): Out = x.asInstanceOf[Out]
}
object I {
type Aux[X] = I {type Out = X}
def apply[A]: Aux[A] = new I {type Out = A}
}
val x: Float = I[Float].create(1)
val ax: Array[Float] = I[Float].step.create(Array(0.1f))
val aax: Array[Array[Float]] = I[Float].step.step.create(Array(Array(0.1f)))
//The following fail to compile
//val aax2: Array[Array[Float]] = I[Float].step.create(Array(0.1f))
//val aax3: Array[Float] = I[Float].step.step.create(Array(0.1f))