参数类型推断 以及 柯里化

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)

结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值