Неявные аргументы: как кодировать в сигнатуре функции?

После удивительно интересного вопроса @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
Другие вопросы по тегам