找不到Shapeshape不合格的flatMap FlatMapper

时间:2019-04-16 12:26:54

标签: scala shapeless type-level-computation

我正在尝试定义一些这样的结构

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

我想过滤名称为Set一部分的元素

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 个答案:

答案 0 :(得分:1)

我想您会误解类型级别的计算。

如果要根据元素是否为Set的一部分来过滤hlist,则必须在编译时知道(如果元素是Set的一部分),但实际上您仅在运行时才知道。因此filterName无效。

例如,您可以将hlist转换为列表,并在运行时将其过滤为普通集合。