【转】Scala片段 1:Folding

原文链接  http://www.ituring.com.cn/article/131425

本文翻译自: Scala snippets 1: Folding

个人能力有限 如翻译不恰当的地方麻烦指正下^_^ [email protected]



Scala为Java开发者提供了很多不错的特性和类库以此来编写更优美和简洁的代码。

但一下子要理解这么多的概念是一件困难的事。在这个由短小的文章组成的系列中,

我将会示范一些scala背后的观点,并且向你展示如何使用它们。

这个系列没有严格的结构,我只是展示一些我找到的有趣的概念。

折叠和反折叠(Folding and unfolding) 在这个片段中,我们将关注folding

来自于wikipedia的folding的定义:

“在函数式编程中,fold - 同样被称为reduce,accumulate,aggregate,compress或者inject -是指一类高阶函数,它们通过递归调用给定的合并操作来处理递归的数据结构并返回最终的结果”

http://en.wikipedia.org/wiki/Fold_(higher-order_function)

大体上,你输入一些数据,应用一个方法并且返回不同的值。让我们看一下fold的方法签名:

def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1  

首先看一下官方文档: 使用二元合并操作对traversableiterator的元素进行折叠。

对元素操作的执行顺序是不明确的也可能每次操作的执行顺序都不同。

  • A1:二元操作的一个类型参数,是A类型的父类
  • z:对于fold操作来说中立的元素;可能会任意次数增加到结果中,必须确保不影响结果。
    (比如,Nil对于列表链接操作,0对于加法操作,或1对于乘法操作)
  • op:一个二元合并操作
  • 返回:将fold操作op应用在所有元素和z间的结果。

阅读这些描述总让我感到头疼,让我们来看一个例子:

scala> val list = "Hello World this is a string".split(" ");
list: Array[String] = Array(Hello, World, this, is, a, string)

scala> list.fold(">>") {(z, i) => z + ":" + i }
res3: String = >>:Hello:World:this:is:a:string

我们在这里先创建了一个List[String]。我们在这个对象上调用fold方法。我们提供的第一个参数是开始的值,

第二个参数是我们需要应用到这个列表每一个值上的函数。

在这个例子里,我们只是将这些值连接到一起。这个函数的返回值被用于下一次调用的输入值。

让我们来看一下接下来的几个例子:

计算元素的和:

scala> val list = List.range(0, 20)
list: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)

scala> list.fold(0){(z, i) => z + i }
res10: Int = 190

或者元素的积:

scala> val list = List.range(1, 20)
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)

scala> list.fold(1){(z, i) => i * z}
res12: Int = 109641728

是不是很简单!这里有更多进阶的对于fold的使用例子,

但基本的观念是一样的:http://oldfashionedsoftware.com/2009/07/30/lots-and-lots-of-foldleft-examples/

时间: 2024-10-08 17:24:54

【转】Scala片段 1:Folding的相关文章

【转】Scala 片段3:列表的map,flatMap,zip和reduce

原文链接 http://www.ituring.com.cn/article/131442 本文翻译自:Scala snippets 3: Lists together with Map, flatmap, zip and reduce [email protected] 如果不了解map,flatMap,zip和reduce函数,你就不能真正地谈论scala. 通过这些函数,我们可以非常容易地处理列表的内容并结合Option对象工作. 你可以在这个站点找到更多的片段: Scala片段 1:Fo

【转】Scala 片段2:List的操作符魔法

原文链接 http://www.ituring.com.cn/article/131439 本文翻译自:Scala snippets 2: List symbol magic [email protected] Scala的每一个操作符都可以是函数,所以重载操作符(实际上不是真正的重载操作符,毕竟操作符都已经是方法了) 是一件非常简单并且在很多库中都能看见的事.在这个片段中,我们将探讨一些让列表操作更加简单的方法重载. 让我们从++操作符开始.首先,就像我们一直做的那样,让我们来创建一个列表:

(转)scala学习笔记(8): 列表的map,flatMap,zip和reduce

http://www.ituring.com.cn/article/131442 https://twitter.github.io/scala_school/zh_cn/collections.html#flatten 如果不了解map,flatMap,zip和reduce函数,你就不能真正地谈论scala.通过这些函数,我们可以非常容易地处理列表的内容并结合Option对象工作.你可以在这个站点找到更多的片段:Scala片段 1:FoldingScala 片段2:List的操作符魔法 让我们

sublime text3 之snippet编写代码片段

sublime text 3 中有个强大的功能就是可以编写各种文件类型的snippet代码片段,可以节省大量的时间. 文件名为:jekyll-top.sublime-snippet(.sublime-snippet)后缀必须这样 <snippet> <content><![CDATA[/** * author:qinbb * title:智能推荐${1:标题} */ ${2}]]></content> <!-- Optional: Set a tabT

Can you share some Scala List class examples?

Scala List FAQ: Can you share some Scala List class examples? The Scala List class may be the most commonly used data structure in Scala applications. Therefore, it's very helpful to know how create lists, merge lists, select items from lists, operat

【转】Scala:fold,foldLeft和foldRight区别与联系

原文链接  http://www.iteblog.com/archives/1228 从本质上说,fold函数将一种格式的输入数据转化成另外一种格式返回. fold, foldLeft和foldRight这三个函数除了有一点点不同外,做的事情差不多. 我将在下文解释它们的共同点并解释它们的不同点. 我将从一个简单的例子开始,用fold计算一系列整型的和. 1 val numbers = List(5, 4, 8, 6, 2) 2 numbers.fold(0) { (z, i) => 3   z

Scala学习笔记一:scala语法词法

一.前言 Scala程序使用的是Unicode的BMP字符集(wiki:BMP字符集),就目前而言Unicode supplement字符集并不支持.这一章从scala模型和xml模型定义scala的语法分析.如果没有特别提到,默认指的是scala模型,并且规定字符是ASCII码的\u0000到\u007F片段. 在Scala模型中,Unicode编码是由十六进制数组成 UnicodeEscape ::= ‘\’ ‘u’ {‘u’} hexDigit hexDigit hexDigit hexD

Scala深入浅出实战经典之 List的foldLeft、foldRight、sort操作代码实战

Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy   访问密码 45e2 以下为第37讲List的foldLeft.foldRight.sort操作代码实战 package com.parllay.scala.dataset /** * Created by richard on

scala 简要: xml处理

Scala提供了对xml的内建支持,可以用scala.xml.Elem的值表示一个XML元素.Node类是所有xml节点类型的父类,Elem类描述xml元素.要处理某个元素的属性键和值,可以用attributes属性,然后用()来访问定键的值 ,使用循环或asAttrMap方法遍历所有属性. 内嵌的字符串会被转成Atom[String]节点,所以可在xml中包含scala代码,被内嵌的scala代码还可以继续包含XML片段,被引用的字符串当中的花括号不会被解析和求值. NodeSeq提供了类似x