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

scala – flatMap(func)和flatMap(func(_))

发布时间:2020-12-16 09:10:46 所属栏目:安全 来源:网络整理
导读:我非常惊讶,因为没有找到一个现有的问题.为什么呢? val p: Int = Option[Int] = Some(_)List(1,2,3).flatMap(p) 我越来越: console:14: error: type mismatch; found : Int = Option[Int] required: Int = scala.collection.GenTraversableOnce[?] List(1,
我非常惊讶,因为没有找到一个现有的问题.为什么呢?

val p: Int => Option[Int] = Some(_)
List(1,2,3).flatMap(p)

我越来越:

<console>:14: error: type mismatch;
 found   : Int => Option[Int]
 required: Int => scala.collection.GenTraversableOnce[?]
       List(1,3).flatMap(p)

但是如果我用最后一行替换它,它会按预期的方式编译和工作:

List(1,3).flatMap(p(_))

我的问题是,在p(_)的情况下,类型推理系统踢入lambda的类型,并且在找到Option [Int](option2Iterable,我相信)的适当隐式转换的途中.只需p,该类型已经知道,它是不正确的,所以没有转换尝试(并且没有转换为Function1返回选项到Function1返回GenTraversableOnce).

这个推理是正确的吗?如果是这样,是否有一些原因我不应该报告这个bug /问题?

编辑:一个新的变化:我已经看到p.apply中提到了一些(可悲的)删除的评论(虽然这是关于编码风格).令人惊讶的是,它的工作原理与p(_)一样.

解决方法

当您键入List(1,3).flatMap(p(_))幕后完成的是,函数p被生成并包含在部分应用它的另一个函数中 – 这意味着所有必要的隐式转换(如果有的话)将也可以在这个新功能的体内应用.

当您键入List(1,3).flatMap(p)时,不会发生函数应用程序,并尝试传递Int =>选项[Int]与签名不兼容Int => GenTraversableOnce [Int],虽然范围包含从[T]到Iterable [T]的隐式转换,但是没有定义Function1 [Int,Option [Int]]到Function1 [Int,Iterable [Int]]的转换.

这样做的原因可能是因为任意自由的功能由于泛型而几乎无限量的变化,并且由于函数不共享超文本,对于每种类型的函数都需要相当多的含义.

这是一个扩展flatMap的结构,足以达到p所需的结果.然而,它使得flatMap的已经模糊的签名更不清楚(更不清楚).我相信,没有实施这种行为的技术障碍,但签名的复杂性是为什么Scala收藏库经常被称赞的原因.

import scala.collection.GenTraversableOnce
import scala.collection.generic.CanBuildFrom

implicit class ListEx[A](list: List[A]) {
  def flatMap2[B,M[_],That](f: A => M[B])
                             (implicit bf: CanBuildFrom[List[A],B,That],view: M[B] => GenTraversableOnce[B]): That =
    list.flatMap(f andThen view)
}

val p: Int => Option[Int] = Some(_)

List(1,3) flatMap2 p

(编辑:李大同)

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

    推荐文章
      热点阅读