可能重复:
Applying an argument list to curried function using foldLeft in Scala
考虑:
val f = (i: Int, j: Int, k: Int, l: Int) => i + j + k + l
因为人们可以这样做:
f.curried.apply(1).apply(2).apply(3).apply(4)
很容易陷入尝试这个的陷阱:
List(1, 2, 3, 4).foldLeft(f.curried) { (fs, e) => fs.apply(e) }
但是,一旦对其应用参数,折叠中的B
参数会更改类型。在此示例中,第一次迭代将从(Int) => (Int) => (Int) => (Int) => Int
更改为(Int) => (Int) => (Int) => Int
。
问题:如何解决这个问题?
答案 0 :(得分:2)
您应该可以使用HList执行此操作 - 有关在异构列表上构建折叠函数的示例,请参阅http://apocalisp.wordpress.com/2010/07/08/type-level-programming-in-scala-part-6b-hlist%C2%A0folds/。
编辑 - 上面评论中的hbatista链接提供了完整的解决方案。