首页 > 其他分享 >Scala之柯里化和隐式转换

Scala之柯里化和隐式转换

时间:2023-05-30 21:33:04浏览次数:28  
标签:之柯里化 Scala Int scala class 隐式 参数 implicit


1. 柯里化

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

scala> val mul = (x: Int, y: Int) => x*y
mul: (Int, Int) => Int = <function2>

scala> val mulOneAtTime = (x: Int) => ((y: Int) => x*y) // 柯里化
mulOneAtTime: Int => (Int => Int) = <function1>

scala> mulOneAtTime(6)(7)
res0: Int = 42

scala> def mulOneTimel(x: Int)(y: Int) = x*y // 简写的柯里化
mulOneTimel: (x: Int)(y: Int)Int

scala> mulOneTimel(6)(7)
res1: Int = 42

2. 隐式转换和隐式参数

2.1. 概念

隐式转换和隐式参数是 Scala 中两个非常强大的功能,利用隐式转换和隐式参数,你可以提供优雅的类库,对类库的使用者隐匿掉那些枯燥乏味的细节。

2.2. 作用

隐式的对类的方法进行增强,丰富现有类库的功能。

2.3. 隐式转换函数

是指那种以 implicit 关键字声明的带有单个参数的函数,这种函数将被自动引用,将值从一种类型转换成另一种类型。

2.4. 案例

import java.io.File
import scala.io.Source


//隐式的增强File类的方法
class RichFile(val from: File) {
  def read = Source.fromFile(from.getPath).mkString
}

object RichFile {
  //隐式转换方法
  implicit def file2RichFile(from: File) = new RichFile(from)

}

object ImplicitTransferDemo{
  def main(args: Array[String]): Unit = {
    //导入隐式转换
    import RichFile._
    //import RichFile.file2RichFile
    println(new File("c://words.txt").read)

  }
}

注意:

(1) 只能在别的trait/类/对象内部定义。

object Helpers {
       implicit class RichInt(x: Int) // 正确!
    }
    implicit class RichDouble(x: Double) // 错误!

(2) 构造函数只能携带一个非隐式参数。

implicit class RichDate(date: java.util.Date) // 正确!
 implicit class Indexer[T](collecton: Seq[T], index: Int) // 错误!
 implicit class Indexer[T](collecton: Seq[T])(implicit index: Index) // 正确!

虽然我们可以创建带有多个非隐式参数的隐式类,但这些类无法用于隐式转换。

(3) 在同一作用域内,不能有任何方法、成员或对象与隐式类同名。这意味着隐式类不能是case class。

object Bar
implicit class Bar(x: Int) // 错误!

val x = 5
implicit class x(y: Int) // 错误!

implicit case class Baz(x: Int) // 错误!

标签:之柯里化,Scala,Int,scala,class,隐式,参数,implicit
From: https://blog.51cto.com/u_16145034/6382106

相关文章

  • jsp学习日志一,基本用法和隐式对象
    基本用法在第一个index.jsp文件中<formaction="monday-01.jsp"><inputtype="text"name="uname"><inputtype="submit"value="提交"></form>而monday.jsp文件中<%Stringa=request.getPa......
  • PowerShell命令,找到项目里行数最多的scala文件
    代码Get-ChildItem-Recurse-Filter*.scala|ForEach-Object{$_|Add-Member-NotePropertyName'Lines'-NotePropertyValue(Get-Content$_.FullName|Measure-Object-Line).Lines-PassThru}|Sort-ObjectLines-Descending|Select-Object-First5......
  • 在本地运行spark程序,出现Scala module 2.13.4 requires Jackson Databind version >=
    这是jackson多版本题,我们需要屏蔽所有hadoop组件中的Jackson,在pom.xml文件里修改:添加<exclusions><exclusion><groupId>com.fasterxml.jackson.module</groupId><artifactId>*</artifactId></exclusion><exclusion>......
  • 隐式扫描不到 Bean 的定义
    案例:隐式扫描不到Bean的定义(https://www.java567.com,搜"java")在构建Web服务时,我们常使用SpringBoot来快速构建。例如,使用下面的包结构和相关代码来完成一个简易的Web版HelloWorld:  其中,负责启动程序的Application类定义如下: packagecom.spring.puzzle.clas......
  • HTB ACADEMY-Linux Privilege Escalation WRITE UP
    WehavebeencontractedtoperformasecurityhardeningassessmentagainstoneoftheINLANEFREIGHTorganizations'public-facingwebservers.Theclienthasprovideduswithalowprivilegedusertoassessthesecurityoftheserver.ConnectviaSSH......
  • Scala:一门灵活多态的编程语言
    基本语法和数据类型Scala的语法有很多共性与Java,它们都是基于C语言的语法规则。Scala中的数据类型也与Java类似,包括整数、浮点数、布尔值和字符串。你可以像Java一样声明和使用这些数据类型。与Java不同的是,Scala中的数值类型默认是基于对象的,因此你可以像调用对象方法一样调用数值......
  • Scala初学者指南
    本文已收录至Github,推荐阅读......
  • 八、部署scala
    服务和组件Scala2.11.8解压:tar-zxvfscala-2.11.8.tgz重命名:mv/usr/local/src/scala-2.11.8//usr/local/src/scala分发:scp-r/usr/local/src/scala/slave1:/usr/local/src/scp-r/usr/local/src/scala/slave2:/usr/local/src/配置环境变量:vi/etc/profileexpor......
  • Scala中实现和Python一致的整数除法和整数求余
    \[\color{black}{\text{Inscala,it'sweirdtomimic`%``//`ofpython}}\]/*Python's%operatorreturnsaresultwiththesamesignasthedivisor,and//roundstowardsnegativeinfinity.InScala,%and/don'tbehavethesameway.......
  • Scala 树状数组BIT模板
    Problem:6404.将数组清空目录CodeCodeobjectSolution{defcountOperationsToEmptyArray(nums:Array[Int]):Long={valn=nums.lengthvalid=Array.tabulate(n)(i=>i)valsortedId=id.sortWith((i,j)=>nums(i)-nums(j)<0)......