Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 以类似HList的样式生成嵌套数据结构_Scala_Types_Nested_Shapeless - Fatal编程技术网

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))