柯里化函数Curring,函数的名称是以科学家Haskell Brooks Curry的名字命名的,指的是将原来函数中接收两个参数的传入,将两个参数拆开,变成接收第一个参数的函数,新的函数返回一个以原来第二个参数为参数的函数。
为便于理解柯里化函数,先列举一个未被柯里化的函数multiple,它实现对两个参数x和y做乘法;然后列举一个multipleOne函数,显示柯里化的过程,这个函数实际调用了两个函数,第一个函数调用带有单个参数x,并返回给第二个函数的函数值,然后匿名函数(y:Int)=>x∗y带有int类型参数y,计算出x与y乘积;最后我们将multiple函数柯里化,生成柯里化的同一个函数curring(x:Int)(y:Int),应用于这个函数两个列表的各自的一个参数。
在Scala交互式命令行中定义一个函数multiple,multiple函数没有被柯里化,函数对两个int类型参数x,y做乘法,计算println(multiple(6,7))为42。如例3-12所示。
【例3-12】Scala定义multiple函数示例。
相对应,将函数multiple进行改造,函数multipleOne先接收一个参数,然后生成另一个接收单个参数的函数,计算出println(multipleone(6)(7)的指为42。如例3-13所示。
【例3-13】Scala定义multipleOne函数示例。(www.daowen.com)
Scala可以将multiple函数进行柯里化改造,将两个参数分别传入计算,println(curring(10)(10))计算出结果为100,def curring(x:Int)(y:Int)=x∗y就是柯里化函数。如例3-14所示。
【例3-14】Scala柯里化函数定义示例。
Scala具有的强大的类型推断功能,使用柯里化函数,Scala根据第一个参数的类型,推导出第二个参数的类型,从而进行a与b的比较,如下所示:
这里,corresponds(b)(_.equalsIgnoreCase(_))中corresponds是一个柯里化函数,传入一个参数b,然后再传给另一个参数_.equalsIgnoreCase(_);类型推断器可以推断出b的类型,然后利用这个信息来分析传入p:(A,B)=>Boolean的函数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。