scala 中的“隐式”现在已弃用还是至少不再需要了?

Maa*_*mon 4 scala implicit typeclass fs2

检查 fs2 教程,我偶然发现了以下代码

def client[F[_]: MonadCancelThrow: Console: Network]: F[Unit] =
  Network[F].client(SocketAddress(host"localhost", port"5555")).use { socket =>
    socket.write(Chunk.array("Hello, world!".getBytes)) >>
      socket.read(8192).flatMap { response =>
        Console[F].println(s"Response: $response")
      }
  }
Run Code Online (Sandbox Code Playgroud)

在哪里

Network[F].client
Run Code Online (Sandbox Code Playgroud)

感觉很奇怪,因为我通常不会写

implictly[Network[F]].client
Run Code Online (Sandbox Code Playgroud)

所以我检查了代码并且它可以工作和编译,所以它一定是隐式不再需要了。我想知道从什么时候开始?它会被弃用吗?有人可以分享 scala 发行说明的链接或说明这一点的东西吗?

And*_*kin 10

这只是许多库遵循的约定:如果FooBar[K]是某个类型类,那么通常会apply在伴随对象上定义一个方法,其签名看起来有点像这样:

object FooBar {
  def apply[K](implicit ev: FooBar[K]): FooBar[K] = ev
}
Run Code Online (Sandbox Code Playgroud)

或者可能(如果希望有一个更精确的类型,特别是如果想要访问类型成员ev),如下所示:

object FooBar {
  def apply[K](implicit ev: FooBar[K]): ev.type = ev
}
Run Code Online (Sandbox Code Playgroud)

从而允许写下与表达式类型完全相同的值级表达式:

FooBar[K]: FooBar[K] // desugars into FooBar.apply[F](<implicit instance>)
Run Code Online (Sandbox Code Playgroud)

这是Network指向 github 的链接,评论是我的)中的此方法:

def apply[F[_]](implicit F: Network[F]): F.type = F
//        ^--- type-constructor
//                       ^--- value
//                                  ^--- type-constructor
//                                       ^--- value
//                                                ^--- value
Run Code Online (Sandbox Code Playgroud)

此约定独立于 Scala 3 中的implicitly/summon更改,并且几乎不受其影响。

  • 我认为你在这里有一个拼写错误 `def apply[K](implicitly ev: FooBar[K]): FooBar[K] = ev` 它应该使用隐式而不是隐式 no 作为参数。 (2认同)
  • 如果应用召唤程序使用 .type 返回比隐式更精确的类型,那么它可能会超出约定。 (2认同)

Lev*_*sey 5

implicitly 没有被弃用。

有一种模式,通常在类型级别生态系统中看到,fs2 就是其中之一,apply将伴生对象中的方法作为 的同义词implicitly,这允许用户代码不使用implicitly