如何在参数func需要隐式视图的情况下编写这个高阶函数?

时间:2013-02-09 01:03:28

标签: scala implicit

我有一个函数,它使用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?

2 个答案:

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

有效,因为来自

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