1

我有一个使用 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 => 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?

4

2 回答 2

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))
于 2013-02-09T08:54:47.787 回答
0

我认为@Eastsun 的解决方案

 useFunc(List(1,2,3))(x => needSeq(x))

有效,因为C来自

def useFunc[A, C <% Seq[A], R](col: C)(f: C => R)

现在由x表示,并且 kind ofList 的类型与 needSeq 采用的参数类型连接起来

或者可以说上面的两条线更相似:

 def useFunc[A, C <% Seq[A], R]  (col: C)   (f: C => R)
     useFunc                  (List(1,2,3)) (x => needSeq(x))
于 2013-08-06T23:32:01.577 回答