Scala中的Curried函数的折叠

Scala中的Curried函数的折叠,scala,functional-programming,Scala,Functional Programming,可能重复: 考虑: 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) } 但是,一旦对fold中的B参数应用参数,它的类型就会改变。在本例中,第一次

可能重复:

考虑:

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) }
但是,一旦对fold中的
B
参数应用参数,它的类型就会改变。在本例中,第一次迭代将从
(Int)=>(Int)=>(Int)=>(Int)=>(Int)=>Int
更改为
(Int)=>(Int)=>(Int)=>Int


问题:如何解决此问题?

您应该能够使用HList完成此操作-有关在异构列表上构建折叠函数的示例,请参阅


编辑-上面评论中hbatista的链接提供了一个完整的解决方案,可以做到这一点。

我认为这没有意义。在
(fs,e)=>fs.apply(e)
中,您实际上在每次迭代中为
fs
使用不同的类型,这是一个不同的
apply
函数。我不知道它是怎么工作的。我认为问题在于,我们并不完全清楚这里在寻找什么。标题中建议的问题-折叠curried函数-永远不会起作用,因为您发现了这个问题。那么,根本问题是什么?将参数列表应用于函数?中讨论了这一点。这是重复的;请投票关闭它。