scala 中的 "implictly" 现在是否已弃用或至少不再需要?
is "implictly" in scala now deprecated or at least not required anymore?
查看 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")
}
}
哪里
Network[F].client
感觉很奇怪,因为我通常不会写
implictly[Network[F]].client
所以我检查了代码,它可以工作和编译,所以一定是不再需要隐式了。我想知道从什么时候开始?它会被弃用吗?有人可以将 link 分享到 Scala 发行说明或声明的内容吗?
这只是许多库遵循的约定:如果 FooBar[K]
是某个类型类,那么通常会在伴随对象上定义一个 apply
方法,其签名看起来有点像这样:
object FooBar {
def apply[K](implicit ev: FooBar[K]): FooBar[K] = ev
}
或者也许(如果想要更精确的类型,特别是如果想要 ev
的 have access to type members),像这样:
object FooBar {
def apply[K](implicit ev: FooBar[K]): ev.type = ev
}
从而允许写下与表达式类型完全相同的值级表达式:
FooBar[K]: FooBar[K] // desugars into FooBar.apply[F](<implicit instance>)
这是Network
中的这个方法(link to github,评论是我的):
def apply[F[_]](implicit F: Network[F]): F.type = F
// ^--- type-constructor
// ^--- value
// ^--- type-constructor
// ^--- value
// ^--- value
此约定独立于 Scala 3 中的 implicitly
/summon
更改,并且几乎不受其影响。
implicitly
未弃用。
有一种模式,通常在类型级生态系统中看到,fs2 就是其中之一,它使伴随对象中的 apply
方法成为 implicitly
的同义词,这允许用户代码不使用 implicitly
.
查看 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")
}
}
哪里
Network[F].client
感觉很奇怪,因为我通常不会写
implictly[Network[F]].client
所以我检查了代码,它可以工作和编译,所以一定是不再需要隐式了。我想知道从什么时候开始?它会被弃用吗?有人可以将 link 分享到 Scala 发行说明或声明的内容吗?
这只是许多库遵循的约定:如果 FooBar[K]
是某个类型类,那么通常会在伴随对象上定义一个 apply
方法,其签名看起来有点像这样:
object FooBar {
def apply[K](implicit ev: FooBar[K]): FooBar[K] = ev
}
或者也许(如果想要更精确的类型,特别是如果想要 ev
的 have access to type members),像这样:
object FooBar {
def apply[K](implicit ev: FooBar[K]): ev.type = ev
}
从而允许写下与表达式类型完全相同的值级表达式:
FooBar[K]: FooBar[K] // desugars into FooBar.apply[F](<implicit instance>)
这是Network
中的这个方法(link to github,评论是我的):
def apply[F[_]](implicit F: Network[F]): F.type = F
// ^--- type-constructor
// ^--- value
// ^--- type-constructor
// ^--- value
// ^--- value
此约定独立于 Scala 3 中的 implicitly
/summon
更改,并且几乎不受其影响。
implicitly
未弃用。
有一种模式,通常在类型级生态系统中看到,fs2 就是其中之一,它使伴随对象中的 apply
方法成为 implicitly
的同义词,这允许用户代码不使用 implicitly
.