Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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_Shapeless - Fatal编程技术网

Scala 具有元组和函数的无形状HList多态函数

Scala 具有元组和函数的无形状HList多态函数,scala,shapeless,Scala,Shapeless,使用下面的代码片段,我无法理解为什么最终值结果的类型为Any: object reporter extends Poly1 { implicit def wrap[T, F <% (Function1[String, T], Nat)] = at[F] { fn => val f = fn._1 val n = fn._2 println(s"Running ${n}") f.asInstanceOf[Function[String, T]]

使用下面的代码片段,我无法理解为什么最终值
结果
的类型为
Any

object reporter extends Poly1 {
  implicit def wrap[T, F <% (Function1[String, T], Nat)] = at[F] { fn =>
    val f = fn._1
    val n = fn._2
    println(s"Running ${n}")
    f.asInstanceOf[Function[String, T]]
  }
}

val stringToInt = ((s: String) => s.toInt) :: HNil
val indexed = stringToInt zipWithIndex
val reported = indexed map reporter

// this is an `Any`, unfortunately
val result = reported.head("1") 
object reporter扩展了Poly1{
隐式def wrap[T,F
val f=fn._1
val n=fn.\u 2
println(s“Running${n}”)
f、 asInstanceOf[函数[字符串,T]]
}
}
val stringToInt=((s:String)=>s.toInt)::HNil
val索引=stringToInt zipWithIndex
val reported=索引地图报告器
//不幸的是,这是一个“Any”
val结果=报告的头(“1”)
这些类型在
映射之前看起来是正确的,但我一辈子都搞不清楚它在哪里丢失了类型


注意:这是针对Shapeless 2.3.0-SNAPSHOT运行的。

您通常不希望在使用Shapeless时编写
Nat
,除非将其作为类型参数的上限约束(或者在某些特定情况下,您希望接受文本整数值作为参数,并使其在类型级别可用,但这与此无关)

在您的例子中,视图绑定将被取消绑定到类型为
F=>(String=>T,Nat)的隐式参数
,Scala编译器将无法正确推断出
t
。如果我现在不太厌倦思考Scala,我可以尝试找出原因,但我不确定这有多重要,因为您不希望或不需要在这种情况下开始,您可以添加
N]=
在[(字符串=>T,N)]{fn=>
val f=fn._1
val n=fn.\u 2
println(s“Running${n}”)
F
}
}
val stringToInt=((s:String)=>s.toInt)::HNil
val索引=stringToInt zipWithIndex
val reported=索引地图报告器
val结果=报告的头(“1”)

这将按预期工作,
结果
将被静态输入为
Int

您是一个向导。我刚刚意识到我遗漏了另一个问题。如何获得正确的隐式以使
n.toInt
工作?@jsw我建议添加一个
(隐式ti:ops.nat.toInt[n])
隐式参数列表以
换行
,然后仅使用
ti()
获取值(而不是使用
Nat
值)。一个诡辩…如果您希望它成为从
Int
文本隐式转换为
Nat
文本的目标,那么使用纯
Nat
作为方法参数类型是有意义的。请参见例如。@MilesSabin我已经诡辩过了(在我的第一个插入语中)!:@TravisBrown(你是这样做的:-)
import shapeless._

object reporter extends Poly1 {
  implicit def wrap[T, N <: Nat]: Case.Aux[(String => T, N), String => T] =
    at[(String => T, N)] { fn =>
      val f = fn._1
      val n = fn._2
      println(s"Running ${n}")
      f
    }
  }

val stringToInt = ((s: String) => s.toInt) :: HNil
val indexed = stringToInt zipWithIndex
val reported = indexed map reporter

val result = reported.head("1")