31 August 2022
Scala 高级编程
dark syntax sugar
- methods with singar param: use {} instead param value .example:scala.util.Try{ // sth }
- single abstract methods class:
// after scala 2. type Action{ def act(i:Int):Int } val myAct:Action=(x:Int)=>x
- last param assicoative methods def :: execute right to left
- infix type : 中缀表达式
- update function : a=b means a.update(b) eg
array(1)==2 means array.update(1,2)
- setter : def variable_=(i:Int):unit 使用这种形式可以认为是 变量variable 的setter 方法
模式匹配
可以匹配的类型
- 常量
- 通配符
- 样例类
- 元组
- 其它
通过对普通的class的伴生对象中(编译器不强求,只是约定俗称) 定义
def upapply(obj:classType):Option[Tupele]
,可以在unapply 方法中定义谓词来返回None None的条件就是模式不匹配的情况 使用返回值为Boolean 的 unapply 方法来定义 中缀表示法 decomposing sequence: unapplySeq 方法 重写unapply 的返回类型 给新类型定义 get:T isEmpty 方法就可以了
#### 偏函数 偏函数可以提升为完整函数 完整函数可以被声明为偏函数,因为偏函数是完整函数的子类型 偏函数只能有一个参数类型 偏函数 定义 isDefinedAt 和 apply
### 定义纯函数的set 思路: 使用head 和tail 结构,所有实现中只处理head,对tail 部分直接递归调用即可。 set 自身是callable的
trait Set[A] extends (A=>Boolean)
``
定义了: NonemptySet, EmptySet,AllInclusiveSet,PropertyBasedSet
定义 unary_! 的! 方法;
### 部分应用函数
ETA-expansion; functions !=methods
def add(i:Int)(j:Int)=i+j val add5=add(5) _ val add6:Int=>Int=add(6) def add7(j:Int)=add(7)(j) def add8 ```
lazy
call By need
lazy filter:withFilter
for 表达式的底层使用了 lazy 表达
使用 ByName value 来 实现lazy 表达
call by name val value : =>Int