Я пытаюсь использовать 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
s в моем приложении неотъемлемо неразрешимы, поэтому было бы странно помещать метод close для всех Pipe
s
Это ошибка, которую я получаю:
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
не можетздесь помощь?