Неявные аргументы: как кодировать в сигнатуре функции?
После удивительно интересного вопроса @TravisBrown о перечислении ADT, использующих бесформенную форму, у меня остался следующий фрагмент кода:
implicitly[EnumerableAdt[Foo]].values
Я хотел бы заключить это в метод, чтобы мне не пришлось .values
после каждого вызова (мне кажется, таким API чище). Но я не могу понять это правильно. Всякий раз, когда я пытаюсь заключить в капсулу implicitly[EnumerableAdt[Foo]]
Я получаю неявные ошибки разрешения.
То, что я пытался, что было наиболее разумно для меня, было, например:
def imply[T](implicit ev: T):Set[T] = implicitly[EnumerableAdt[T]].values
конечно без ev
сделал еще меньше смысла для меня.
Я не эксперт в программировании на уровне типов.
1 ответ
Если вы посмотрите на определение implicitly[X]
Вы можете видеть, что требуется неявный аргумент типа X
в рамках. В вашем примере у вас есть неявное ev: T
по объему, которого недостаточно назвать implicitly[EnumerableAdt[T]]
! Вместо этого попробуйте следующее определение:
def imply[T](implicit ev: EnumerableAdt[T]):Set[T] = ev.values