我正在尝试使用 symulacrum@typeclass 来避免编写 Ops/Syntax 样板。我有一个用效果和类型参数化的特征:

@typeclass trait Close[F[_], T]{
    def close(t: T): F[Unit]
}

使用目的如下:
trait Stream[F[_], Pipe]{
    def open(): F[Pipe]
    def drain(): F[Unit]
}
object App{
    def runApp[F[_], Pipe: Close[F, ?]](implicit stream: Stream[F, Pipe]) = {
        for{
            pipe <- stream.open()
            _ <- stream.drain(pipe)
            _ <- pipe.close()
        } yield ()
    }
}

我决定把 Close[F[_], T] 放在一边的原因是我的应用程序中的一些 Pipe 本质上是不可关闭的,所以放置有点奇怪
所有 Pipe 的关闭方法

这是我得到的错误:
Error:(32, 4) @typeclass may only be applied to types that take a single type parameter
  @typeclass trait Close[F[_], T]

问题: 如果 trait 有多个类型参数(如 Close[F[_], T] ),我是否必须自己编写所有 Ops/Syntax 样板,而 symulacrum 的 @typeclass 在这里无法提供帮助?

最佳答案

靠你自己。

https://github.com/mpilquist/simulacrum#known-limitations

关于scala - 使用具有多个类型参数的类型类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54723460/

10-13 06:04