【问题标题】:is "implictly" in scala now deprecated or at least not required anymore?scala中的“隐含”现在已被弃用或至少不再需要?
【发布时间】:2021-07-26 15:50:22
【问题描述】:

查看 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

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

【问题讨论】:

  • implicitly 方法在 Scala 3 中为 replacedsummon
  • @MarioGalic 感谢您的回答,我很抱歉没有指定这是一个 scala 2 特定的问题。很高兴提前知道!!!

标签: scala typeclass implicit fs2


【解决方案1】:

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

object FooBar {
  def apply[K](implicit ev: FooBar[K]): FooBar[K] = ev
}

或者可能(如果想要更精确的类型,特别是如果想要have access to type members of ev),像这样:

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,cmets是我的):

def apply[F[_]](implicit F: Network[F]): F.type = F
//        ^--- type-constructor
//                       ^--- value
//                                  ^--- type-constructor
//                                       ^--- value
//                                                ^--- value

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

【讨论】:

  • 好的,感谢您明确表示:)
  • 我认为你这里有一个错字def apply[K](implicitly ev: FooBar[K]): FooBar[K] = ev 它应该使用隐式而不是隐式否,作为参数。
  • @MaatDeamon 哦,是的,确实,我是 using 方法名称而不是正确的关键字...谢谢,已修复。
  • 如果应用召唤师返回的 .type 类型比隐式返回更精确的类型,这可能有点超出惯例。
【解决方案2】:

implicitly 未被弃用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多