首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >平坦的隐函数在哪里定义?

平坦的隐函数在哪里定义?
EN

Stack Overflow用户
提问于 2022-09-10 11:12:11
回答 2查看 63关注 0票数 0

扁平化被定义为:

代码语言:javascript
复制
override def flatten[B](implicit toIterableOnce: A => IterableOnce[B])

我的代码是:

代码语言:javascript
复制
val myList = List(1,2,3)
println(myList.map(x => List(x, 2*x)).flatten)

因此,如果我正确理解它,当我调用flatten时,我需要在某个地方定义一个隐式函数,这个函数以ListInt作为输入并返回IterableOnceInt。

我还没有定义任何这样的函数,而且代码工作得很好,所以在某个地方可以找到隐式函数。我怎样才能找到它的确切定义?我在Predef料到了,但似乎不在那里。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-10 11:40:00

如果你这样做了

代码语言:javascript
复制
// libraryDependencies += scalaOrganization.value % "scala-reflect" % scalaVersion.value
import scala.reflect.runtime.universe.reify

println(reify{ myList.map(x => List(x, 2*x)).flatten }.tree)

你终究会明白的

代码语言:javascript
复制
App.this.myList.map(((x) => `package`.List.apply(x, 2.$times(x)))).flatten(Predef.$conforms)

因此隐式toIterableOnce: A => IterableOnce[B]Predef.$conforms (您是对的,它在Predef中)

https://github.com/scala/scala/blob/2.13.x/src/library/scala/Predef.scala#L510

代码语言:javascript
复制
/** An implicit of type `A => A` is available for all `A` because it can always
 *  be implemented using the identity function. This also means that an
 *  implicit of type `A => B` is always available when `A <: B`, because
 *  `(A => A) <: (A => B)`.
 */
// $ to avoid accidental shadowing (e.g. scala/bug#7788)
implicit def $conforms[A]: A => A = <:<.refl

的确,List[Int] <: IterableOnce[Int]

代码语言:javascript
复制
implicitly[List[Int] <:< IterableOnce[Int]] // compiles
implicitly[List[Int] => IterableOnce[Int]] // compiles

知道如何进行调试是很有用的:

In scala 2 or 3, is it possible to debug implicit resolution process in runtime?

票数 4
EN

Stack Overflow用户

发布于 2022-09-10 17:19:06

FWIW,如果使用Scala 2,也可以使用-Xprint:typer标志使用scalascalac运行程序,您将看到在程序中插入编译器的所有内容:

代码语言:javascript
复制
  println(myList.map(x => List(x, 2*x)).flatten)

被翻译成:

代码语言:javascript
复制
scala.Predef.println(Main.this.myList.map[List[Int]](((x: Int) => 
  scala.`package`.List.apply[Int](x, 2.*(x))))
    .flatten[Any](scala.Predef.$conforms[List[Int]]))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73671331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档