Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如果参数func需要隐式视图,我应该如何编写这个高阶函数?_Scala_Implicit - Fatal编程技术网

Scala 如果参数func需要隐式视图,我应该如何编写这个高阶函数?

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,

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