Scala的折叠式咖喱功能
问题描述:
可能重复:
Applying an argument list to curried function using foldLeft in ScalaScala的折叠式咖喱功能
考虑:
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
。
问题:如何解决这个问题?
答
您应该可以使用HList完成此任务 - 请参阅http://apocalisp.wordpress.com/2010/07/08/type-level-programming-in-scala-part-6b-hlist%C2%A0folds/,以获取在异构列表上构建折叠函数的示例。
编辑 - 上面评论中的hbatista的链接提供了一个完整的解决方案,做到这一点。
我不认为这是有道理的。在'(fs,e)=> fs.apply(e)''你实际上在每次迭代时对'fs'使用了一个不同的类型,它是一个不同的'apply'函数。我不明白它是如何工作的。 – Gabe 2012-01-09 16:29:18
我认为问题在于不清楚在这里寻找什么。标题中提出的问题 - 折叠咖喱函数 - 由于您确定的问题而无法正常工作。那么底层的问题是什么?将参数列表应用于函数? – Submonoid 2012-01-09 16:34:46
这是在[这个问题]讨论(http://stackoverflow.com/questions/7606587/applying-an-argument-list-to-curried-function-using-foldleft-in-scala)。 – hbatista 2012-01-09 16:35:01