flatMap с бесформенным выходом FlatMapper не найден - PullRequest
1 голос
/ 16 апреля 2019

Я пытаюсь определить некоторую структуру, подобную этой

case class Transformer[From, To](
                                 name: String,
                                 get: PaymentEvent => From,
                                 to: From => To

Я хочу отфильтровать элементы с именами, которые являются частью набора

class filterName(names: Set[String]) extends lowPriority {
  implicit def get[From, To]  = at[Transformer[From, To]]{ trans =>
    if (names.contains(trans.name))
      trans :: HNil
    else
      HNil
  }
}

Это конкретное значение:

  type HTransformer = Transformer[String, String] :: Transformer[Long, Long] :: HNil

Когда я хочу применить функцию к значению

  private def filter(fields: HTransformer, names: Set[String]): HTransformer = {
    fields.flatMap(new filterName(names))
  }

Компилятор сообщает об ошибках:

Error:(42, 19) could not find implicit value for parameter mapper: shapeless.ops.hlist.FlatMapper[f.type,shapeless.::[com.ingenico.datalake.Transformer[String,String],shapeless.::[com.ingenico.datalake.Transformer[Long,Long],shapeless.HNil]]]
    fields.flatMap(new filterName(names))

1 Ответ

1 голос
/ 16 апреля 2019

Полагаю, вы неправильно понимаете вычисления на уровне типов.

Если вы хотите отфильтровать hlist в зависимости от того, является ли элемент частью набора, вы должны знать это (если элемент является частью набора) во время компиляции, но на самом деле вы знаете это только во время выполнения. Так что filterName не будет работать.

Например, вы можете преобразовать hlist в список и отфильтровать его как обычную коллекцию во время выполнения.

...