是";含蓄地;在scala中,现在不推荐使用,或者至少不再需要了?

是";含蓄地;在scala中,现在不推荐使用,或者至少不再需要了?,scala,typeclass,implicit,fs2,Scala,Typeclass,Implicit,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!".getByte

在查看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")
      }
  }
在哪里

感觉像我不常写的那样文雅

implictly[Network[F]].client

所以我检查了代码,它工作并编译,所以它肯定是隐式不再需要了。不知从什么时候开始?它会被弃用吗?有人能分享scala发行说明的链接吗?

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

object FooBar {
  def apply[K](implicit ev: FooBar[K]): FooBar[K] = ev
}
object FooBar {
  def apply[K](implicit ev: FooBar[K]): ev.type = ev
}
或者可能(如果想要更精确的类型,尤其是想要
ev
),如下所示:

object FooBar {
  def apply[K](implicit ev: FooBar[K]): FooBar[K] = ev
}
object FooBar {
  def apply[K](implicit ev: FooBar[K]): ev.type = ev
}
从而允许写下与表达式类型完全相同的值级表达式:

FooBar[K]: FooBar[K] // desugars into FooBar.apply[F](<implicit instance>)

此约定独立于Scala 3中的
隐式
/
召唤
更改,并且大部分不受其影响。

隐式
未被弃用


在typelevel生态系统中,通常可以看到一种模式,其中fs2是一种模式,它使伴随对象中的
apply
方法隐式地成为
的同义词,它允许用户代码不隐式地使用Scala 3中的
召唤
方法。@MarioGalic感谢您的回答,并为没有指定这是Scala 2的特定问题而道歉。很高兴提前知道!!!好的,谢谢你明确指出:)我想你这里有一个输入错误
def apply[K](隐式ev:FooBar[K]):FooBar[K]=ev
它应该使用隐式而不是隐式no作为参数。@MaatDeamon哦,是的,的确,我是
使用了方法名而不是正确的关键字。。。谢谢,修复了。如果应用召唤器使用.type返回更精确的类型,而不是隐式返回,那么它可能会比常规多一点。