加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读