【问题标题】:Evaluate curried function评估柯里化函数
【发布时间】:2015-03-12 05:05:08
【问题描述】:

这个柯里化函数接受一个有两个参数的函数并将其转换为一个有1个参数的函数:

def hotcurry[A, B, C](f: (A, B) => C): A => (B => C) =
  a => b => f(a, b)                             //> hotcurry: [A, B, C](f: (A, B) => C)A => (B => C)

def f(a : Int , b : Int) = a + b          //> f: (a: Int, b: Int)Int

hotcurry(f)                               //> res0: Int => (Int => Int) = <function1>

如何评估返回函数res0: Int =&gt; (Int =&gt; Int) = &lt;function1&gt;

我试过fu(2) //&gt; res0: Int =&gt; Int = &lt;function1&gt;

这个函数有什么好的用例?

【问题讨论】:

    标签: scala


    【解决方案1】:

    一次只传递一个参数:

    val g: Int => (Int => Int) = (a: Int) => (b: Int) => a + b
    g(3)(4)
    // res4: Int = 7
    

    g 接受一个Int,并返回一个函数Int =&gt; Int。然后该函数接受Int 并返回Int。因此,您将参数传递给第一个函数,然后将一个参数传递给返回的函数。

    在你的情况下,只需这样做:

    val g = hotcurry(f)
    g(3)(4)
    

    如果您有一个二参数函数,您可以使用它,稍后您想将其用作一参数函数,提前打包一个参数。例如,map 接受一个参数Int =&gt; Int,所以你可以这样做:

    val add = hotcurry(f)
    val add3 = add(3)
    Vector(1, 2, 3).map(add3)
    // Vector(4, 5, 6)
    

    【讨论】:

    • 谢谢,由于某种原因,它并没有沉没,因为 "Int => Int = " 是一个采用 int 并返回一个采用单个 Int 参数的函数的函数。
    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 2018-01-03
    • 2016-01-01
    • 2021-02-07
    • 2012-10-06
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    相关资源
    最近更新 更多