31 August 2022

Scala 高级编程

dark syntax sugar

  1. methods with singar param: use {} instead param value .example:scala.util.Try{ // sth }
  2. single abstract methods class:
    // after scala 2.
    type Action{
     def act(i:Int):Int
    }
    val myAct:Action=(x:Int)=>x
    
  3. last param assicoative methods def :: execute right to left
  4. infix type : 中缀表达式
  5. update function : a=b means a.update(b) eg array(1)==2 means array.update(1,2)
  6. 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