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

После удивительно просвещенного question by @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