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函数-永远不会起作用,因为您发现了这个问题。那么,根本问题是什么?将参数列表应用于函数?中讨论了这一点。这是重复的;请投票关闭它。