Scala中的折叠Curried函数

时间:2012-01-09 16:18:57

标签: scala functional-programming

  

可能重复:
  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

问题:如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您应该可以使用HList执行此操作 - 有关在异构列表上构建折叠函数的示例,请参阅http://apocalisp.wordpress.com/2010/07/08/type-level-programming-in-scala-part-6b-hlist%C2%A0folds/

编辑 - 上面评论中的hbatista链接提供了完整的解决方案。