【问题标题】:Folding Curried Functions in Scala [duplicate]在Scala中折叠咖喱函数[重复]
【发布时间】:2012-01-10 00:47:25
【问题描述】:

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

问题:如何解决?

【问题讨论】:

  • 我认为这没有意义。在(fs, e) => fs.apply(e) 中,您实际上在每次迭代中为fs 使用不同的类型,它是不同的apply 函数。我不明白它是如何工作的。
  • 我认为问题在于这里要查找的内容并不完全清楚。由于您发现的问题,标题中建议的问题 - 折叠 curried 函数 - 永远不会起作用。那么根本问题是什么?将参数列表应用于函数?
  • 这已在this question 中讨论过。
  • 这是重复的;请投票关闭它。

标签: scala functional-programming


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-26
    • 2016-10-20
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多