scala – 用于理解的map/flatmap函数是什么?
发布时间:2020-12-16 19:11:07 所属栏目:安全 来源:网络整理
导读:我想看看在map / flatmap中传递的f函数,但没有运气.我抛出了一个异常,看到f的任何迹象,都没有用.那是什么功能?它是如何在幕后产生的? Exception in thread "main" java.lang.RuntimeException at x.x.Main$A.getInt(Empty.scala:8) at x.x.Main$A.flatMap(
我想看看在map / flatmap中传递的f函数,但没有运气.我抛出了一个异常,看到f的任何迹象,都没有用.那是什么功能?它是如何在幕后产生的?
Exception in thread "main" java.lang.RuntimeException at x.x.Main$A.getInt(Empty.scala:8) at x.x.Main$A.flatMap(Empty.scala:10) object Main extends App { class A { def getInt: Int = throw new RuntimeException def map(f: Int => Boolean): Boolean = f(getInt) def flatMap(f: Int => Boolean): Boolean = f(getInt) } for { x <- new A y <- new A } yield x == y } 解决方法
你的理解的等价代码
for { x <- new A y <- new A } yield x == y 是这样的: new A().flatMap{ x => new A().map{ y => x == y } } 您可以使用scalac -Xprint:parser main.scala来获取从for-comprehension生成的代码.在这种情况下,你会得到这个: new A().flatMap(((x) => new A().map(((y) => x.$eq$eq(y))))) 如果没有像这样的附加宏,你也可以在REPL中获取它: import reflect.runtime.universe._ show{ reify{ for { x <- new A y <- new A } yield x == y }.tree } // new $read.A().flatMap(((x) => new $read.A().map(((y) => x.$eq$eq(y))))) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |