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

Scala类型推理混乱

  •  0
  • chenyuandong  · 技术社区  · 7 年前
      trait IO[F[_], +A]
      case class Pure[F[_], +A](get: A) extends IO[F,A]
      case class Request[F[_], I, +A](expr: F[I], receive: I => IO[F,A]) extends IO[F,A]
    
      trait Console[A]
      case object ReadLine extends Console[Option[String]]
      case class PrintLine(s: String) extends Console[Unit]
    
      trait Run[F[_]] {
        def apply[A](expr: F[A]): (A, Run[F])
      }
    
      object IO {
        @annotation.tailrec
        def run[F[_],A](R: Run[F])(io: IO[F,A]): A = io match {
          case Pure(a) => a
          case Request(expr,recv) =>
            R(expr) match { case (e,r2) => println(e.getClass); run(r2)(recv(e)) }
        }
      }
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   sepp2k    7 年前

    从定义 Request ,我们知道 expr 具有类型 F[I] recv 具有类型 I => IO[F, A] . 从定义 Run R(expr) 将具有类型 (I, Run[F]) . 所以 e 具有类型 I 接收 .

    recv(e) 即使我们什么都不知道 .

    我也认为recv将被推断为请求[F[?],没什么,A]跑了[F[?],A]函数。

    接收 具有类型 I=>输入输出[F,A] 哪里 F A 类型变量来自 run 是用作 对象已创建。

    推荐文章