【问题标题】:Scala type inference with function typesScala 类型推断与函数类型
【发布时间】:2016-03-03 11:02:03
【问题描述】:

考虑下面这段代码:(需要解决的实际代码见下文)

def applyAll[T,S, U <: Seq[T => S]](l : U, x: T) = l.map(f => f(x))
val u = List((i: Int) => i + 1, (i: Int) => i + 2)
println(applyAll(u,1))

(给定 SeqT =&gt; S 和一个值,我们希望得到应用于此值的函数)。

虽然applyAll 可以正常编译,但在u 上调用它会出现以下错误:

Error:(35, 13) inferred type arguments [Int,Nothing,List[Int => Int]] do not conform to method applyAll's type parameter bounds [T,S,U <: Seq[T => S]]
println(applyAll(u,1))
        ^

这表明编译器无法推断类型参数S,我猜这是因为它“嵌套”在函数类型T =&gt; S中。


编辑:

我尝试修复的实际代码类似(尽管很复杂),并且无法通过删除 U 参数来修复。这里是:

def applyNatural[T, S, Repr <: TraversableLike[T => S, Repr], That]
(data: T, jobs: Repr)
(implicit bf: CanBuildFrom[Repr, S, That]): That = {
  jobs.map(f => f(data))
}
val u = List((i: Int) => i + 1, (i: Int) => i + 2)
val v = applyNatural(1, u)
println(v)

【问题讨论】:

  • 我发现编辑代码有两个问题:首先,Repr 是循环的。要解析Repr,您必须查找Repr。其次,没有构建源。
  • 你到底想做什么?
  • 我正在寻找一个函数,它可以将一组函数应用于一个值,并返回一组相同类型的值。
  • 所以输入是函数的集合和 T 类型的值,它应该返回 T 的集合?

标签: scala generics types type-inference


【解决方案1】:

U 根本没用。随便写

  def applyAll[T,S](l :  Seq[T => S], x: T) = l.map(f => f(x))
  val u = List((i: Int) => i + 1, (i: Int) => i + 2)
  println(applyAll(u,1))

【讨论】:

  • 谢谢,这适用于给定的代码,虽然它不能解决我实际上试图解决的问题(我过于简单化了一点) - 我已经用我的实际问题更新了问题
【解决方案2】:

您可以将Repr 设为更高类型的Repr[_],并将jobs 参数设为Repr[T =&gt; S] 类型:

def applyNatural[T, S, Repr[A] <: TraversableLike[A, Repr[A]], That]
  (data: T, jobs: Repr[T => S])
  (implicit bf: CanBuildFrom[Repr[T => S], S, That]
): That = {
  jobs.map(f => f(data))
}

【讨论】:

  • 行得通!我还管理了 def applyNatural[T, S, U <: traversable> S], That](data: T, jobs: Traversable[T => S,U])(implicit bf: CanBuildFrom[U, S , 那个那个 ;但你的解决方案更好
猜你喜欢
  • 2023-03-08
  • 2013-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 2013-02-19
  • 1970-01-01
相关资源
最近更新 更多