函数柯里化(Currying)示例

  ”函数柯里化”是指将多变量函数拆解为单变量的多个函数的调用, 可以从高元函数动态地生成大量低元的函数。可以看成一个强大的函数工厂,结合函数式编程,可以叠加出很BT的能力。下面给出了一个示例,说明如何使用 Currying 用一行代码计算任意指数的多项式的和; 以及使用 Currying 实现一个简单的文件处理框架。

  注意到, Currying 的过程中,参数的顺序是有讲究的。一般, 函数参数建议放在前面,按照想要调用的顺序; 数据参数放在后面。

package scalastudy.basic

import scala.util.matching.Regex
import scala.math.pow
import scalastudy.utils.{PathConstants, DefaultFileUtil}

/**
 * Created by lovesqcc on 16-4-16.
 */
object CurryDemo extends App {

  launch()

  def launch(): Unit = {

    val listNum = 10
    val alist = (1 to listNum).toList

    for (i <- 1 to 3) {
      val listPolySum = polynomialSum(i)(_)
      println(listPolySum(alist))
    }

    val filename = PathConstants.scalaSrcPath + "/basic/CurryDemo.scala"
    val fileContentHandler = handleFile(DefaultFileUtil.readFile)(_)
    val findInFileFunc = fileContentHandler(findInFile)(_)
    println(findInFileFunc(filename))

    val countInFileFunc = fileContentHandler(countInFile)(_)
    println("Non Empty Lines: " + countInFileFunc(filename))
  }

  /*
   * calc 1^m + 2^m + ... + n^m
   */
  def polynomialSum(m: Int)(list: List[Int]): Long = {
      return list.map(pow(_,m)).sum.asInstanceOf[Long];
  }

  def handleFile(filePathHandler:(String) => String)
                (fileContentHandler: (String) => Any)
                (filepath: String): Any = {
      return fileContentHandler(filePathHandler(filepath))
  }

  def findInFile(text:String):Any = {
    val patt = "f\\w+".r
    return patt.findAllIn(text).toList
  }

  def countInFile(text:String):Any = {
    return text.split("\n").toList.filter(s => ! s.matches("^\\s*$")).length
  }

}
package scalastudy.utils

/**
 * Created by lovesqcc on 16-4-16.
 */
object PathConstants {

  val projPath = System.getProperty("user.dir")
  val scalaSrcPath = projPath + "/src/main/java/scalastudy"

}
时间: 2024-10-09 15:16:01

函数柯里化(Currying)示例的相关文章

Swift函数柯里化(Currying)简谈

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 下面简单说说Swift语言中的函数柯里化简单的说就是把接收多个参数的函数划分为若干个"嵌套"的单一参数的函数. 这样说谁也听不懂,我们结合一个例子给大家简单说说. 我们需要定义一个函数A,该函数返回一个函数B,函数B创建一只大蜘蛛.为什么要间接返回大蜘蛛,因为本猫最怕大蜘蛛,所以不敢直接返回大蜘蛛 ;) 首先是蜘蛛的类: class Spider:C

深入理解javascript函数进阶系列第二篇——函数柯里化

前面的话 函数柯里化currying的概念最早由俄国数学家Moses Schönfinkel发明,而后由著名的数理逻辑学家Haskell Curry将其丰富和发展,currying由此得名.本文将详细介绍函数柯里化(curring) 定义 currying又称部分求值.一个currying的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来.待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值 从

【转】详解JS函数柯里化

第一次看到柯里化这个词的时候,还是在看一篇算法相关的博客提到把函数柯里化,那时一看这个词就感觉很高端,实际上当你了解了后才发现其实就是高阶函数的一个特殊用法.果然是不管作用怎么样都要有个高端的名字才有用. 首先看看柯里化到底是什么? 维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 看这个解释有一点抽象,我们就拿被做了无数次示例的add函数,

JS函数柯里化

第一次看到柯里化这个词的时候,还是在看一篇算法相关的博客提到把函数柯里化,那时一看这个词就感觉很高端,实际上当你了解了后才发现其实就是高阶函数的一个特殊用法. 果然是不管作用怎么样都要有个高端的名字才有用. 首先看看柯里化到底是什么? 维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 看这个解释有一点抽象,我们就拿被做了无数次示例的add函数

JS中的柯里化(currying)

何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字命名). 柯里化通常也称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果.因此柯里化的过程是逐步传参,逐步缩小函数的适用范围,逐步求解的过程. 柯里化一个求和函数 按照分步求值,我们看一个简单的例子 var concat3Words = function (a

建议75:函数柯里化

柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回一个新函数,这个新函数能够接受原函数的参数.下面可以通过例子来帮助理解.function adder(num) {    return function(x) {        return num + x;    }}var add5 = adder(5);var add6 = adder(6);print(add5(1));  // 6print(add6(1));  //7 函数adder接受一个参数,并返回一个函数,这个返

柯里化(currying)真正作用

关于柯里化(currying)的目的和作用一直很模糊,网上的资料很多都没有说到重点,大部分只关注于如何实现柯里化,而对其用途闪烁其词,直到最近看了这里: http://www.cnblogs.com/pigtail/p/3447660.html 个人认为所有写代码的技巧目的只有两个:一是提高程序性能,而是使代码模块化,减少耦合增强其可维护性.柯里化的作用很明显是属于第二种.经过柯里化之后,函数的通用性有所降低,但是适用性有所提高. 柯里化并没有我们想象中那么高深,其实我们经常在不知不觉中使用了柯

【前端学习笔记】函数柯里化(自网易云课堂)

1. 函数柯里化通常是指把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的并且返回一个接受余下的参数而且返回结果的新函数的技术. // 1. 最简单的柯里化 // sum函数接受三个参数,并返回求和结果 var sum = function(a,b,c) { return a+b+c; } // 最简单柯里化的sum函数 var sum_curry = function(a){ return function(b,c){ return a+b+c; } } 2. 更泛化的定义是

JavaScript函数柯里化的一些思考

1. 高阶函数的坑 在学习柯里化之前,我们首先来看下面一段代码: var f1 = function(x){ return f(x); }; f1(x); 很多同学都能看出来,这些写是非常傻的,因为函数f1和f是等效的,我们直接令var f1 = f;就行了,完全没有必要包裹那么一层. 但是,下面一段代码就未必能够看得出问题来了: var getServerStuff = function(callback){ return ajaxCall(function(json){ return cal