我有一个函数,它使用Seq [A]的隐式视图,你可以看到它使用head方法并保留类型: -
scala> def needSeq[A, C <% Seq[A]](col: C) = { (col.head , col) }
needSeq: [A, C](col: C)(implicit evidence$1: C => Seq[A])(A, C)
scala> needSeq(List(1,2,3))
res0: (Int, List[Int]) = (1,List(1, 2, 3))
scala> needSeq(List("a","b"))
res1: (java.lang.String, List[java.lang.String]) = (a,List(a, b))
scala> needSeq(Array("a","b"))
res2: (java.lang.String, Array[java.lang.String]) = (a,Array(a, b))
我想编写一个函数,它接受needSeq之类的函数并将它们应用于参数
scala> def useFunc[A, C <% Seq[A], R](col: C)(f: C => R) = { f(col) }
useFunc: [A, C, R](col: C)(f: C => R)(implicit evidence$1: C => Seq[A])R
问题是因为在参数列表中只提供了一种类型(C),没有来自C =&gt;的隐式视图。 Seq [A]可用
scala> useFunc(List(1,2,3))(needSeq)
<console>:10: error: No implicit view available from C => Seq[A].
useFunc(List(1,2,3))(needSeq)
^
我该如何编写useFunc?
答案 0 :(得分:2)
问题在于定义needSeq
..
如果你可以尝试重构它..
def needSeq[A](col : Seq[A]) = (col.head , col)
然后这两种情况都有效。
useFunc(List(1,2,3))(needSeq) //> res1: (Int, Seq[Int]) = (1,List(1, 2, 3))
useFunc(List(1,2,3))(x => needSeq(x)) //> res2: (Int, Seq[Int]) = (1,List(1, 2, 3))
答案 1 :(得分:0)
我认为来自@Eastsun的解决方案
useFunc(List(1,2,3))(x => needSeq(x))
有效,因为来自
的 Cdef useFunc[A, C <% Seq[A], R](col: C)(f: C => R)
现在由 x 表示,连接类型的List与needSeq所需的参数类型
或者可以说上面的两条线更像是彼此相似:
def useFunc[A, C <% Seq[A], R] (col: C) (f: C => R)
useFunc (List(1,2,3)) (x => needSeq(x))