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

scala – Bizzare类型推理限制 – 多种类型的参数

发布时间:2020-12-16 08:55:54 所属栏目:安全 来源:网络整理
导读:为什么这不编译? trait Lol[A,SA] { def flatMap[B,SB](f: A = Lol[B,SB]): Lol[B,SB] = ???}val p1: Lol[Int,String] = ???val p2: Lol[Double,Nothing] = ???val p5 = p1.flatMap(_ = p2) 结果: found : Int = Lol[Double,Nothing]required: Int = Lol[D
为什么这不编译?

trait Lol[A,SA] {
  def flatMap[B,SB](f: A => Lol[B,SB]): Lol[B,SB] = ???
}

val p1: Lol[Int,String] = ???
val p2: Lol[Double,Nothing] = ???

val p5 = p1.flatMap(_ => p2)

结果:

found   : Int => Lol[Double,Nothing]
required: Int => Lol[Double,SB]
   val p5 = p1.flatMap(_ => p2)
                         ^

事情开始编译时:

> flatMap调用的类型参数是显式的
> SA是协变的(wtf?)
> p2中使用了Nothing之外的其他类型(例如Null)
> SB不会出现在flatMap的返回类型中,也不会出现在该返回类型的协变位置(例如,返回类型为Option [SB])

然而,上述解决方法对我来说是不可接受的.

解决方法

@ retronym对 SI-9453的评论解释了你所看到的行为.这是一种解决方法……

我们可以合成一个等同于Nothing的类型,它不会导致typer收回推理解决方案,

type ReallyNothing = Nothing { type T = Unit }

即.虚拟细化没什么.现在以问题为例,

scala> :paste
// Entering paste mode (ctrl-D to finish)

trait Lol[A,ReallyNothing] = ???

val p5 = p1.flatMap(_ => p2)

// Exiting paste mode,now interpreting.

scala.NotImplementedError: an implementation is missing
  at scala.Predef$.$qmark$qmark$qmark(Predef.scala:225)
  ... 37 elided

(编辑:李大同)

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

    推荐文章
      热点阅读