我想做这样的事情:
def run(subjects: List[Subject]) = {
val configs = compute()
subjects.map(s => configs.map(c => test(s,c)))
// or flatMap, I don't really care at this point
}
在我的用例中,主题实际上是Subject[T]
,我在结果中需要T
的类型安全版本。所以我有:
def run[L <: HList](subjects: L)(implicit mapper: Mapper[testFun.type, L]) = {
val configs = compute()
subjects.map(testFun)
}
但是,现在我无法将配置传递给testFun
,根据this post,它需要具有单例类型。
可以选择:
val cfgHL = HList.fill(subjects.length)(configs)
(subjects zip cfgHL).map(testFun)
但HList
目前没有fill
操作。任何提示?
答案 0 :(得分:3)
您可以使用mapConst
完成与fill
相同的操作。如果我们有以下内容:
val xs = 1 :: 'a :: 'a' :: HNil
我们可以写:
scala> xs.zip(xs mapConst "x") == (1, "x") :: ('a, "x") :: ('a', "x") :: HNil
res0: Boolean = true
请注意,还有其他方法可以解决部分应用(更高级别)多态函数然后使用它们进行映射的问题 - 请参阅示例my answer here。但是,对你的用例来说,这样的事情可能会有点过分。