代码之家  ›  专栏  ›  技术社区  ›  Blankman

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

  •  0
  • Blankman  · 技术社区  · 3 年前

    有人能详细说明当类型必须与scala对齐以进行理解时意味着什么吗?

    for {
    ..
    ..
    }
    

    如果所有的电话都返回期货,那么一切都会好起来吗? 只是试着理解它什么时候有效,什么时候无效。

    1 回复  |  直到 3 年前
        1
  •  5
  •   Mario Galic    3 年前

    为了更好地理解map/flatMap调用,请考虑它们的签名。例如,考虑 Option#flatMap

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

    我们看到了 Option s继续参与其中。现在观察一下

    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
    

    但我们已经看到了 选项#flatMap 期待 A => Option[B] A => Try[B] .

    在将Option与List混合时,似乎可以打破这一规则

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

    但这是有效的,因为 List#flatMap 从中获取函数 A 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. 确实可以变化。