首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

10.scala的柯里化

方法可以定义多个参数列表,当使用较少的参数列表调用多参数列表的方法时,会产生一个新的函数,该函数接收剩余的参数列表作为其参数。这被称为柯里化。...下面是一个例子,在Scala集合 trait TraversableOnce 定义了 foldLeft def foldLeft[B](z: B)(op: (B, A) => B): B foldLeft...以下是该函数的一个用例: 从初值0开始, 这里 foldLeft 将函数 (m, n) => m + n 依次应用到列表中的每一个元素和之前累积的值上。...(res) 多参数列表有更复杂的调用语法,因此应该谨慎使用,建议的使用场景包括: 单一的函数参数 在某些情况下存在单一的函数参数时,例如上述例子foldLeft中的op,多参数列表可以使得传递匿名函数作为参数的语法更为简洁...如果不使用多参数列表,代码可能像这样: numbers.foldLeft(0, {(m: Int, n: Int) => m + n}) 注意使用多参数列表时,我们还可以利用Scala的类型推断来让代码更加简洁

46510

Scala Collection简介

scala的默认collections。性能更好。 Mutable: 可变。初始化后,可以发生变化。在多线程的访问时,会使用到锁。 可以定义event,来监视数值的变化。...TreeSet: 一个树的Set实现。通过值的大小判断,需要一个implicit Ordering的实现。 HashSet: 一个Set实现, 使用Hash值来确定对象的唯一性。...推荐使用。 List: 对于head/tail的访问性能最好。 Stream: lazy估值,主要用于无限数列(infinite sequences)。...reduce, reduceLeft, reduceRight: 计算一个单独的累计结果。 fold, foldLeft, foldRight: 计算一个单独的累计结果,带一个起始值。...reduceLeft, foldLeft, scanLeft: 从前到后线性计算。 reduceRight, foldRight, scanRight: 从后到前线性计算。

898100
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    泛函编程(21)-泛函数据类型-Monoid

    从这个思路出发我们很自然得出Monoid就是一种数据类型,或者是一种在泛函编程过程中经常会遇到的数据类型:当我们针对List或者loop进行一个数值的积累操作时我们就会使用到Monoid。...实际上Monoid就是List[A] => A的抽象模型。...实际上我们同样可以用foldMap来实现foldRight和foldLeft:  1 def foldRight[A,B](la: List[A])(z: B)(f: (A,B) => B): B 2...f: A => B): B foldRight和foldLeft的f函数是(A,B) => B,如果用curry表达:A => (B => B),如果能把 A => ?...我们也把Monoid代数模型的一面:函数的互通转换及组合稍微示范了一下。在下一节我们将会把Monoid在实际编程中的应用以及Monoid的深度抽象做些讨论。

    63370

    Scalaz(8)- typeclass:Monoid and Foldable

    所以获取一个类型的Monoid实例需要实现zero和append这两个抽象函数。实际上Monoid typeclass也就是支持了append(|+|)这么一个简单的操作。...实际上Monoid的主要用途是在配合可折叠数据结构(Foldable)对结构内部元素进行操作时使用的。...(A, => A) => A): Option[A] = F.foldRight1Opt(self)(f) 12 final def foldLeft[B](z: B)(f: (B, A) => B...这个foldMap就是一个游览可折叠结构的函数。在游览过程中用Monoid append对结构中元素进行操作。...上面提到Monoid在可折叠数据结构里的元素连续处理有着很好的应用,我们先试一个例子:确定一个可折叠数据结构F[A]中的元素A是否排序的: def ordered(xs: List[Int]): Boolean

    1.1K90

    Scala | 教程 | 学习手册 --- 常用集合

    == Nil res2: Boolean = true cons操作符 cons操作符:: 是两个冒号,可以员工cons操作符来绑定元素,构建列表,而不必使用传统额的List()格式 scala> val...sortBy方法指定一个函数时,它会返回一值,用来对列表中的元素排序。 对于性能方面,::, drop, take在列表前面完成,因此不存在性能损失。...collect使用一个偏函数,只对一部分元素应用 flatMap使用一个给定函数转换各个元素,将结果列表扁平化到这个列表中 map使用给定函数转换各个元素 scala> List(0, 1,...通过迭代处理一个累加器变量(accumulator),这个变量包含目前为止的当前结果,基于当前元素更新累加器。可以实现exists,forall,startsWith和其他boolean操作。...主要关注点是fold和foldLeft版本之间的差别。fold,reduce和scan都限于返回与列表元素类型相同的一个值。foldLeft可以实现forall布尔操作,但是fold做不到。

    57820

    泛函编程(22)-泛函数据类型-Monoid In Action

    试想如果我们对一个超大文件进行文字数统计或者寻找最大值什么的,我们可以把这个大文件分成若干小文件然后同时计算后再合计将节省很多计算时间。在现代大数据时代,数据文件不但大而且是分布在许多服务器上的。...//> foldMapV: [A, B](iseq: IndexedSeq[A])(m: ch10.ex2.Monoid[B])(f: A => B)B 啊,这个foldMapV从外表,在类型款式上跟...值得注意的是以上两个例子foldMapV历遍无论如何是不会中途退出的。这个特点把foldMapV的使用局限在必须消耗整个数据源的计算应用,如求和、最大值等等。...我们在之前的章节里曾经讨论了一些数据结构如List,Stream,Tree等。当我们需要处理这些结构中封装的元素时通常使用一些算法如折叠算法。这种算法能保存数据结构。...而且它们有共通性:都可以使用折叠算法。

    1.1K60

    大数据技术之_16_Scala学习_08_数据结构(下)-集合操作+模式匹配

    scala 中,可以把一个函数直接赋给一个变量,但是不执行函数,格式:函数名 _   注意:本质上是将内存地址赋值给栈里面的变量!!!     ...化简:将二元函数引用于集合中的函数。   上面的问题当然可以使用遍历 list 方法来解决,这里我们使用 scala 的化简方式来完成。...(5)(minus)) // 3   } } 输出结果如下: -5 3 foldLeft 和 foldRight 缩写方法分别是:/: 和 :\ 示例代码如下: package com.atguigu.chapter11...示例代码链接:xxx 11.8 集合的合并-zip   在开发中,当我们需要将两个集合进行 对偶元组合并,可以使用拉链。...如果 unapply 方法产出一个元组,你可以在 case 语句中使用中置表示法。比如:可以匹配一个 List 序列。

    1.7K00

    Scala学习笔记

    块表达式         在scala中{}中课包含一系列表达式,块中最后一个表达式的值就是块的值     *)scala的循环         For 循环             ...v5: Array[Int] = Array(0, 0, 0, 0, 0)             #取得集合总值,在scala中是在java基础上又一次进行高度的封装,方便用户使用             ...1)概念:柯里化是将方法或者函数中一个带有多个参数的列表拆分成多个小的参数列表(一个或者多个参数)的过程,并且将参数应用前面参数列表时返回新的函数             scala> def sum...res17: Int = 6             #将sum写成柯里化的sum,前面方法使用一个参数列表,“柯里化”把方法或者函数定义成多个参数列表(且第一个参数只有一个参数,剩余的参数可以放在一个参数列表中...(从左到右计算)             foldRight(从右到左计算)             #默认值是字符串类型,List是数字集合的时候,不能使用fold,使用foldLeft或者foldRight

    2.6K40

    泛函编程(24)-泛函数据类型-Monad, monadic programming

    它就是一个很多数据类型组件库的软件接口:使用统一的函数名称来实现不同数据类型的不同功能效果。  ...这个问题会被scala编译器的类系统(type system)逮住,然后终止编译过程。是不是能从解决类系统问题方面着手呢?...type lambda在scalaz里使用很普遍,主要还是解决了数据类型参数不匹配问题。...说明:foldLeft(z:B)(f:(B,A)=>B)的z是个intStateMonad实例类型B,所以foldLeft的操作函数就是:(intStateMonad,A)=>intStateMonad...在这个例子里我们了解了Monad的意义: 1、可以使用for-comprehension 2、支持泛函式的循序命令执行流程,即:在高阶类结构内部执行操作流程。

    798100

    R、Python、Scala 和 Java,到底该使用哪一种大数据编程语言?

    确定这个项目的问题领域,确定这个项目的基础设施,在往上,确定项目的框架,选择最适合用来处理当前数据的所有内容。这个时候唯一摆在你面前的难题就是,这个项目到底该使用哪种语言。...而如果你想利用比你机器提供的功能还强大的功能,那可以使用SparkR绑定,在R上运行Spark。...Scala 现在说说Scala:在本文介绍的四种语言中,Scala是最轻松的语言,因为大家都欣赏其类型系统。...Scala在JVM上运行,基本上成功地结合了函数范式和面向对象范式,目前它在金融界和需要处理海量数据的公司企业中取得了巨大进展,常常采用一种大规模分布式方式来处理(比如Twitter和LinkedIn)...不过考虑到它拥有图灵完备(Turing-complete)的类型系统和各种弯弯曲曲的运算符(“/:”代表foldLeft,“:\”代表foldRight),很容易打开Scala文件,以为你看到的是某段讨厌的

    1.6K50

    scala(十三) 集合

    集合简介 说明: Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质。...对于几乎所有的集合类,Scala都同时提供了可变和不可变的版本,分别位于以下两个包 不可变集合:scala.collection.immutable 可变集合: scala.collection.mutable...,函数第一个参数的值 = 集合第一个元素 reduce中函数在第N次计算的时候,函数第一个参数的值 = N-1次的计算结果 案例:汇总 val list5=List[Int](23,1,2,34,5432,22...,函数第一个参数的值 = 默认值 【与reduce区别的部分】 fold中的函数在第N次计算的时候,函数第一个参数的值 = N-1次的计算结果 val list6 = List(1,2,3) val...( func: (集合元素, B) => B ): 从右向左计算 foldRight中的函数在第一次计算的时候,函数第二个参数的值 = 默认值 foldRight中的函数在第N次计算的时候,函数第二个参数的值

    48120
    领券