博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scala 函数式编程_柯里化_Currying
阅读量:6360 次
发布时间:2019-06-23

本文共 2663 字,大约阅读时间需要 8 分钟。

hot3.png

Scala 函数式编程_柯里化_Currying

柯里化

    在计算机科学中,柯里化(英语:Currying) 是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由Christopher Strachey以逻辑学家哈斯凯尔·加里命名的,尽管它是Moses Schonfinkel和戈特洛布·弗雷格发明的。

直接看示例

一个简单的函数柯里化,如下,

def foo(a: Int): (Int)=>Int = {  println("===1===")  def fooF(b: Int): Int = {    println("===3===")    a * a + b * b  }  println("===2===")  fooF}println((foo(3))(4))

运行结果是,

E:\test-scala>scala currying.scala===1======2======3===25

这个示例就是返回一个 函数 fooF,从而再次调用这个函数(更普遍的说法是把返回的函数应用于4),下面再来看一个例子,返回一个匿名函数,如下,

// 返回一个匿名函数 (y: Int) => x * ydef mulOneAtATime(x: Int) = (y: Int) => x * yprintln(mulOneAtATime(3)(2))

这样也实现了函数的柯里化,mulOneAtATime同时也是一个高阶函数。这个函数在scala中可以简写成下面这样,

def mulOneAtATime2(x: Int)(y: Int) = x * yprintln(mulOneAtATime(3)(2))

和lambda表达式差不多,绑定了变量x , y。

再来看一个复杂的例子,例如 设计一个获取本地文本文件的所有行数据的功能,主函数功能主要是创建文件流读取文件的所有行,在读取过程中,需要做很多的辅助操作如判断本地文件是否存在和可读和关闭文件流。

function_app_main.scala

import java.io.{BufferedReader, FileReader, Closeable, File}def getLinesSelf(filename: String): List[String] = {  getLines(filename)(isReadable)(closeStream)}def getLines(filename: String)(isFileReadable: (File) => Boolean)(closableStream: (Closeable) => Unit): List[String] = {  val file = new File(filename)  if (isFileReadable(file)) {    val readerStream = new FileReader(file)    val buffer = new BufferedReader(readerStream)    try {      var list: List[String] = List()      var str = ""      var isReadOver = false      while (!isReadOver) {        str = buffer.readLine()        if (str == null) isReadOver = true        else list = str :: list      }      list.reverse    } finally {      closableStream(buffer)      closableStream(readerStream)    }  } else {    List()  }}def isReadable(file: File) = {  if (null != file && file.exists() && file.canRead()) true  else false}def closeStream(stream: Closeable) {  if (null != stream) {    try {      stream.close    } catch {      case ex: Throwable => println(ex.getMessage)    }  }}val fileName = "d:/test.txt"val list: List[String] = getLinesSelf(fileName)println(list.size)list.foreach(item => println(item))

运行这个scala 脚本,

C:\WorkSpace6-scala\scala-train\src\com\usoft>scala function_app_main.scala

就可以看到你想要的结果。主要看一下 这个函数,

getLines(filename: String)(isFileReadable: (File) => Boolean)(closableStream: (Closeable) => Unit): List[String]

这个函数表示

filename: String 接收一个String类型的参数 filename

(isFileReadable: (File) => Boolean) 接收一个 参数为File类型,返回值为Boolean 类型的函数

(closableStream: (Closeable) => Unit) 接收一个参数为 Closeable类型,返回Unit 类型的函数

这也是柯里化的函数的链式调用

getLines(filename)(isReadable)(closeStream)

参考:

============================END============================

转载于:https://my.oschina.net/xinxingegeya/blog/359351

你可能感兴趣的文章
java 反射 判断是否存在_如何判断Javascript对象是否存在
查看>>
java 可变参数列表 数组_java可变参数列表如何填充数组?
查看>>
java 比较2个时间大小写_date - Java 8:计算两个LocalDateTime之间的差异
查看>>
java aop注解日志记录_springMVC自定义注解,用AOP来实现日志记录的方法
查看>>
java字符如何向float转换_java – 将float转换为字符串分数表示
查看>>
数组成员是函数java_在Laravel 5.6中调用数组上的成员函数links()
查看>>
java生成xml文件名中文乱码_jdom解决中文乱码问题 JAVA生成xml文件 | 学步园
查看>>
php mysql exec_PHP: PDO::exec - Manual
查看>>
java dateutils工具类_日期工具类DateUtils | 学步园
查看>>
centos 部署mysql5.7_centos7部署mysql-5.7
查看>>
java tostring 格式化日期_ASP.NET格式化日期
查看>>
爱卡创誓记java饰品,《创誓记AIKA》芙兰精灵配上框架眼睛折服宅男宅女
查看>>
学php c语言,一个学过C语言的小编学习PHP编程微课是什么样的一种体验?-php是什么文件...
查看>>
PHP网站加功能,如何实现添加分类的功能
查看>>
php 阶乘函数,什么是PHP中的RECURSIVE函数?
查看>>
php 协议头,入门PHP实现MQTT协议的固定头部(Fix header)
查看>>
php留言板上传图片,thinkphp3.2.3留言板带管理没有后台ajax上传图片功能
查看>>
php定时任务管理,Zebra-Crontab
查看>>
java程序本质,方法学之Java的本质
查看>>
ip登陆异常 php,PHP实例:PHP制作登录异常ip检测功能的实例代码
查看>>