Scala 如果参数func需要隐式视图,我应该如何编写这个高阶函数?
我有一个函数,它使用Seq[a]的隐式视图,您可以看到它使用head方法并保留类型:-Scala 如果参数func需要隐式视图,我应该如何编写这个高阶函数?,scala,implicit,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,
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))
scala>def needSeq[A,C Seq[A])(A,C)
scala>needSeq(列表(1,2,3))
res0:(Int,List[Int])=(1,List(1,2,3))
scala>needSeq(列表(“a”、“b”))
res1:(java.lang.String,List[java.lang.String])=(a,List(a,b))
scala>needSeq(数组(“a”、“b”))
res2:(java.lang.String,数组[java.lang.String])=(a,数组(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
scala>def useFunc[A,cr)={f(col)}
useFunc:[A,C,R](col:C)(f:C=>R)(隐式证据$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)
^
scala>useFunc(列表(1,2,3))(needSeq)
:10:错误:C=>Seq[A]中没有隐式视图可用。
useFunc(列表(1,2,3))(needSeq)
^
如何编写useFunc?问题在于定义
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))
我认为来自@Eastsun的解决方案
useFunc(List(1,2,3))(x => needSeq(x))
因为C来自
def useFunc[A, C <% Seq[A], R](col: C)(f: C => R)
def useFunc[A,C,R]
现在由x表示,并将列表类型与needSeq采用的参数类型相连接
或者可以这样说,上面的两条线更相似:
def useFunc[A, C <% Seq[A], R] (col: C) (f: C => R)
useFunc (List(1,2,3)) (x => needSeq(x))
def useFunc[A,C,R]
useFunc(列表(1,2,3))(x=>needSeq(x))
使用useFunc(List(1,2,3))(x=>needSeq(x))
而不是useFunc(List(1,2,3))(needSeq)
感谢@Eastsun的工作:-),当然还有useFunc(List(1,2,3))(needSeq()
也能工作……您能解释一下为什么编译器现在可以找到隐式视图吗?是不是因为在useFunc使用“f”之前,计算被延迟得更久了?您好,谢谢@Shrey,问题是这会把数组的用例搞乱,请参见上面的示例,它现在返回一个运行时类型的WrappedArray,即loose这是一些类型信息…所以我仍然在寻找解决方案:-/事实上,它在列表用例中也丢失了类型信息,看看它如何返回(Int,Seq[Int]),而不是(Int,List(1,2,3))?