文档章节

参数类型推断 以及 柯里化

blue1110
 blue1110
发布于 2015/01/20 17:01
字数 546
阅读 137
收藏 6

    Scala 混合了面向对象以及函数式的特性。在函数式编程语言中,函数是头等公民,可以像其他任何数据一样被传递和操作。

  1. 参数类型推断

    当你讲一个匿名函数传递给另一个函数或者方法时候,Scala会尽可能帮助你推断出类型信息。

    举例子来说:


//difine a
val a = List(1,2,4)

//map
a.map((x:Int) => x*3)

由于map方法知道你会传入一个类型为 (Int) => Int 的方法,你可以简单的写成:

a.map(x => x*3)

//如果参数在 =>右侧仅仅出现过一次,可以用_代替
a.map(_ => _*3)
a.map(_ * 3)

错误例子:

def test[A](a: List[A], f: A => A) = a.map(f)

println(test(List(1,2,3), _*2))

error: missing parameter type for expanded function ((x$2) => x$2.$times(2))

为什么在这里第二个函数中A却无法参数识别呢?

根据scala的参数类型推断,流程是从左到右,从参数到参数。在这个例子中,参数之间类型推断是不可行的。

那如何修改呢?我们先看下面的知识点。

2.柯里化 currying

    指的是讲原来接受两个参数的函数变成新的一个接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。

    

def addTwo(x : Int) = (y : Int) => x+y

这个函数接受一个参数,生成了另一个接受一个参数的函数。

如果我们要调用计算两个数的和,那需要:

addTwo(2)(3)

分开来讲,addTwo(2)的结果是(y: Int)=> 2+y。然后这个函数又被应用到3,所以最后结果是5。

Scala支持如下简写来实现柯里化:

scala> def addTwo(x: Int)(y:Int)=x+y

在这里,我们可以应用柯里化,把其中的一个函数单独另出来,以便提供参数推断的信息。

所以在第一部分中讲的那个错误的例子可以改写成:

def test[A](a: List[A])(f: A => A) = a.map(f)
test(List(1))(_+1)

结束。

© 著作权归作者所有

blue1110
粉丝 8
博文 13
码字总数 7360
作品 0
南京
程序员
私信 提问
Scala学习(十二)高阶函数

1.作为值的函数 在Scala中,你可以在变量中存放函数: 这段代码将num设为3.14, fun设为ceil函数。 说明: ceil函数后的 意味着你确实指的是这个函数,而不是碰巧忘记给它传递参数。 从技术上...

我爱春天的毛毛雨
2018/10/09
8
0
JavaScript 函数式编程(二)

slide 地址 三、可以,这很函数式~ 3.1.函数是一等公民! 3.1.1.滥用匿名函数 其实经常写 JavaScript 的人可能潜移默化地已经接受了这个观念,例如你可以像对待任何其他数据类型一样对待函数...

佯真愚
2018/08/13
0
0
Scala基础 - 柯里化(Currying)及其应用

介绍 柯里化(currying, 以逻辑学家Haskell Brooks Curry的名字命名)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。在...

joymufeng
2016/04/04
1K
0
Swift4 中参数类型为元组的单参数函数与多参数函数的类型问题

这是一个有意思的问题,当时我是在处理函数的柯里化,突然发现了Swift的柯里化函数库(Curry)中的函数参数与我平时写的时候有些许不一样,然后我就分析了一下它们的区别,以及为什么要这样做,...

SSBun
2018/01/19
0
0
Java 8怎么了之二:函数和原语

【编者按】本文作者为专注于自然语言处理多年的 [Pierre-Yves Saumont][1],Pierre-Yves 著有30多本主讲 [Java][2] 软件开发的书籍,自2008开始供职于 Alcatel-Lucent 公司,担任软件研发工程...

OneAPM蓝海讯通
2016/05/03
32
0

没有更多内容

加载失败,请刷新页面

加载更多

HashMap源码分析

read

V丶zxw
40分钟前
5
0
Python字符串或JSON字符串转字典dict、列表list

有3种方法 1、使用ast模块 >>> import ast>>> s = '["test",1]'>>> ast.literal_eval(s)['test',1]>>> s = '{"test":1}'>>> ast.literal_eval(s){'test': 1} 2、eval函数,这个......

编程老陆
58分钟前
5
0
【JS复习笔记】03 继承(从ES5到ES6)

本文转载于:专业的前端网站➫【JS复习笔记】03 继承(从ES5到ES6) 前言 很久以前学习《Javascript语言精粹》时,写过一个关于js的系列学习笔记。 最近又跟别人讲什么原型和继承什么的,发现...

前端老手
今天
8
0
简单动态网站搭建

如何在windows服务器上配置wordPress和discuz 网站建设中的概念讲解 网站建设的基础操作 网站程序的基础使用 网站程序的优化 简单动态网站搭建 软件部署 域名和主机的购买 域名解析 环境部署...

达达前端小酒馆
今天
6
0
Java每日面试题_03

15、构造器是否可被override constructor(构造器)不能被继承,所以不能被override(重写),但是可以被overloading(重载)。 16、抽象类和接口的区别 抽象类是什么 含有abstract修饰符的class即...

庭前云落
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部