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
  • 相关阅读:
    mysql慢日志设置
    CURL模拟登陆
    违法图片检测
    PHP取二进制文件头快速判断文件类型
    重写session
    mysql处理高并发,防止库存超卖
    mysql中使用update select
    PHP中使用Luhn算法校验信用卡及借记卡卡号
    红包算法
    DIV当textarea使用,在聚焦的时候将光标移动到内容的末尾
  • 原文地址:https://www.cnblogs.com/luengmingbiao/p/11216319.html
Copyright © 2011-2022 走看看