flatMap with Shapeless yield FlatMapper not found
flatMap with Shapeless yield FlatMapper not found
我正在尝试定义这样的结构
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))
我猜你误解了类型级别的计算。
如果你想根据一个元素是否是 Set 的一部分来过滤 hlist,那么你必须在编译时知道这一点(如果一个元素是 Set 的一部分)但实际上你只在运行时知道这一点.所以 filterName
将不起作用。
例如,您可以将 hlist 转换为列表,并在运行时将其作为普通集合进行过滤。
我正在尝试定义这样的结构
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))
我猜你误解了类型级别的计算。
如果你想根据一个元素是否是 Set 的一部分来过滤 hlist,那么你必须在编译时知道这一点(如果一个元素是 Set 的一部分)但实际上你只在运行时知道这一点.所以 filterName
将不起作用。
例如,您可以将 hlist 转换为列表,并在运行时将其作为普通集合进行过滤。