压缩时类型必须对齐是什么意思?

kkbh8khc  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(339)

有人能详细说明一下,当类型必须与scala对齐才能理解时,它意味着什么吗?

for {
..
..
}

如果所有的电话都返回期货,那么它会好吗?只是试着理解它什么时候起作用,什么时候不起作用。

tzcvj98z

tzcvj98z1#

要理解desugarMap/flatmap调用,请考虑它们的签名。例如,考虑 Option#flatMap ```
def flatMap[B](f: (A) => Option[B]): Option[B]

我们看到了 `Option` 我们继续参与。现在开始观察

for {
a <- Some(41)
b <- Some(1)
} yield a + b

变成

Some(41).flatMap(a => Some(1).map(b => a + b))

这意味着,如果你试图混合一元类型的理解,如

for {
a <- Some(41)
b <- Try(1)
} yield a + b

那它就可以

Some(41).flatMap(a => Try(1).map(b => a + b))
|
types do not align

但我们已经看到了 `Option#flatMap` 期望 `A => Option[B]` 不是 `A => Try[B]` .
一个地方,似乎你可以打破这一规则是当混合选项和名单

scala> for {
| a <- List(41)
| b <- Some(1)
| } yield (a + b)
val res0: List[Int] = List(42)

但这是因为 `List#flatMap` 从中获取函数 `A` 至 `IterableOnce` 以及 `Option` 已经做了 `IterableOnce` 在scala 2.13中

def flatMap[B](f: A => IterableOnce[B])

请注意,另一种方法是行不通的:

scala> for {
| a <- Some(41)
| b <- List(1)
| } yield a + b
b <- List(1)
^
On line 3: error: type mismatch;
found : List[Int]
required: Option[?]

一般来说,给定一个有效类型 `F[A]` 然后进去理解 `F` 另一方面,除非我们使用子类型,否则不能改变 `A` 确实可以改变。

相关问题