zoukankan      html  css  js  c++  java
  • Scala函数柯里化(Currying or Curry)

    柯里化(Currying)  

      把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

      简单的实现如下:

    scala> def add(x:Int, y:Int) = x + y
    add: (x: Int, y: Int)Int

      假如我们应用的时候,是这样的:add(1,2)

      柯里化函数

    scala> def add(x:Int)(y:Int) = x + y

      Curry化最大的意义在于把多个参数的function等价转化成多个单参数function的级联,这样所有的函数就都统一了,方便做lambda演算。 在scala里,curry化对类型推演也有帮助,scala的类型推演是局部的,在同一个参数列表中后面的参数不能借助前面的参数类型进行推演,curry化以后,放在两个参数列表里,后面一个参数列表里的参数可以借助前面一个参数列表里的参数类型进行推演。这就是为什么 foldLeft这种函数的定义都是curry的形式。

      如下是本人查阅资料所了解到Scala语言柯里化函数的四种写法:

    第一种写法:

      不显示声明返回类型,Scala会自动推断出返回类型:

    scala> def currying_1(x:Int) = {
         |     y:String => y * x
         | }

    currying_1: (x: Int)String => String // =>符号意味着返回的是一个函数

      调用方式:

    scala> currying_1(3)("scalA")
    res0: String = scalAscalAscalA

    第二种写法:

      显式声明返回类型——函数:

    scala> def currying_2(x:Int): String => String = {
         |     y => y * x
         | }
    currying_2: (x: Int)String
    => String // =>符号左边的String对应的是y,=>符号右边的String就对应着y * x

       调用方式:

    scala> type curry_2(3) //验证返回类型,确实是个函数
    res5: String => String = <function1>

    第三种写法:

      不显示声明返回类型,Scala会自动推断出返回类型:

    scala> def currying_3(x:Int)(y:String) = {
         |     y * x
         | }
    currying_3: (x: Int)(y: String)String

      调用方式:

    scala> currying_3(3)("ScalA")
    res1: String = ScalAScalAScalA

    第四种写法:

      显式声明返回类型:

    scala> def currying_4(x:Int)(y:String): String = {
         |     y * x
         | }
    currying_4: (x: Int)(y: String)String

      调用方式:

    scala> currying_4(3)("ScalaA")
    res2: String = ScalaAScalaAScalaA
  • 相关阅读:
    快速排序算法
    excel取值
    5.管理控制文件和日志文件
    贝叶斯决策与参数估计小结
    Kernel Methods (5) Kernel PCA
    Kernel Methods (4) Kernel SVM
    Kernel Methods (3) Kernel Linear Regression
    Kernel Methods (2) Kernel function
    Kernel Methods (1) 从简单的例子开始
    PCA算法是怎么跟协方差矩阵/特征值/特征向量勾搭起来的?
  • 原文地址:https://www.cnblogs.com/luengmingbiao/p/11216319.html
Copyright © 2011-2022 走看看