有人能详细说明一下,当类型必须与scala对齐才能理解时,它意味着什么吗?
for { .. .. }
如果所有的电话都返回期货,那么它会好吗?只是试着理解它什么时候起作用,什么时候不起作用。
tzcvj98z1#
要理解desugarMap/flatmap调用,请考虑它们的签名。例如,考虑 Option#flatMap ```def flatMap[B](f: (A) => Option[B]): Option[B]
Option#flatMap
我们看到了 `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 + bb <- List(1)^On line 3: error: type mismatch;found : List[Int]required: Option[?]
一般来说,给定一个有效类型 `F[A]` 然后进去理解 `F` 另一方面,除非我们使用子类型,否则不能改变 `A` 确实可以改变。
1条答案
按热度按时间tzcvj98z1#
要理解desugarMap/flatmap调用,请考虑它们的签名。例如,考虑
Option#flatMap
```def flatMap[B](f: (A) => Option[B]): Option[B]
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
scala> for {
| a <- List(41)
| b <- Some(1)
| } yield (a + b)
val res0: List[Int] = List(42)
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[?]