【发布时间】:2014-05-22 18:04:56
【问题描述】:
我正在尝试定义一个高阶函数f,它在Scala 中接受可变数量的args 类型Wrapper[T]* 和函数参数g。
函数f 应该解封装传入args 的每个对象,然后使用解封装的参数调用g。因此,g 必须接受与args 包含的T 类型参数数量完全相同的参数。
我能做到的最接近的事情是将Seq[T] 传递给g 并在g 内部使用模式匹配。像下面这样:
f("This", "Is", "An", "Example")(x => x match {
case Seq(a:String, b:String, c:String): //Do something.
})
f 定义如下:
def f[V](args: Wrapper[T]*)
(g: (Seq[T]) => (V)) : V = {
val params = args.map(x => x.unwrap())
g(params)
}
- 没有模式怎么可能完成这样的事情 匹配?
-
g的签名可以省略类型 通过使用类型推断,但前提是参数的数量是 固定的。在这种情况下如何做到这一点? - 可以通过
不同类型的参数转换为可变参数,如果类型通配符是
使用
args: Wrapper[_]*。此外,铸造结果x.unwrap到AnyRef并在g中使用模式匹配是 必要的。然而,这完全打破了类型推断和类型 安全。有没有更好的方法在可变参数中混合类型 在这种特殊情况下可能吗?
我也在考虑使用 scala makros 来完成这些任务。
【问题讨论】:
-
仅供参考
List(T) params = args.map(x => x.unwrap)不是有效的 scala 代码 -
已修复。感谢您阅读。
-
元组 -> 简单列出,列出 -> 元组不容易。也许Shapless' HList 可能会满足您的需求。
标签: scala pattern-matching type-inference variadic-functions higher-order-functions