【问题标题】:How do I curry this function in Scala?如何在 Scala 中 curry 这个函数?
【发布时间】:2013-11-13 22:13:45
【问题描述】:

所以根据我读到的内容,我得到了这种形式的currying:

  def arithmetic_iter(op: (Int, Int) => Int, f: Int => Int, base: Int)(a: Int, b: Int): Int = {
    def iter(a: Int, base: Int): Int =
      if (a > b) base
      else iter(a + 1, op(base, f(a)))

    iter(a, base)
  }

但是,我想做这样的事情:

def route(m:Message) = {
  (e: Endpoint) => e.send(m)
}

使用上面的功能。所以我想出了这个数字:

  def arithmetic_iter_lambda(op: (Int, Int) => Int, f: Int => Int, base: Int)(a: Int, b: Int): Int = {
    (a: Int, b: Int) =>
      Int = {
        def iter(a: Int, base: Int): Int =
          if (a > b) base
          else iter(a + 1, op(base, f(a)))

        iter(a, base)
      }
  }

不幸的是,我收到一条错误消息:重新分配给 val。

所以我一直纠结于如何修复算术_iter_lambda。

【问题讨论】:

    标签: scala currying


    【解决方案1】:

    首先,修复算术_iter_lambda,尝试:

    def arithmetic_iter_lambda(op: (Int, Int) => Int, 
                               f: Int => Int, 
                               base: Int): (Int, Int) => Int = {
        (a: Int, b: Int) => {
            def iter(a: Int, base: Int): Int =
              if (a > b) base
              else iter(a + 1, op(base, f(a)))
    
            iter(a, base)
          }
      }
    

    (请注意,我已将函数的参数分割成单独的行,只是为了阻止行运行时间过长)。

    其次,给定您的初始算术_iter 函数,您可以通过以下方式获得相同的效果:

    def alt_arithmetic_iter_lambda(
        op: (Int, Int) => Int,
        f: Int => Int,
        base: Int): (Int, Int) => Int = arithmetic_iter(op, f, base) _
    

    (同样,可以都在一条线上,但会很长)。

    【讨论】:

    • 一,我什至没有意识到我在 _iter 函数上留下了 (a, b)。谢谢你抓住那个。二,所以我看到我没有告诉我的外部函数它将返回一个[接受两个 Int 并返回一个 Int] 的函数。我现在明白我的错误了。谢谢暗影国度。
    • 很高兴我能帮上忙(而且代表提升总是一个很好的感谢;)。实际上,在这种情况下,您可以关闭 : (Int, Int) => Int 结果类型规范,编译器可以推断出正确的结果类型,但我认为保留它通常更有用(良好的自文档代码) - 特别是如果您(或任何其他阅读代码的人)对 Scala 或这个习语不熟悉。
    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 2018-06-17
    • 2012-06-24
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多