函数即对象 Scala (一)

Lecture 4.1

Functions as Objects

将匿名函数看成一个对象   A=>B 其实就是scala.Function1[A, B]

Function1 是scala系统库的一个Trait,包含一个参数的函数特质

Expansion Function Values

通过 x => x*x 解释这个匿名函数其实也是一个匿名类

new class AnoFun extends Function1[Int, Int]{

apply(x: Int) =x*x

}

Expansion Function Calls

f(a, b) 演变成 f.apply(a,b)

Functions and Methods

方法定义不等同与函数值,方法在使用时才有值,不能将方法定义看做函数值

Lecture 4.2

Polymorphism (多态)

多态基于子类和泛型, 这是Java里面有的。这里引出两个重要概念Bound(类型范围) Variance (类型变异)

bound和子类继承相关,bound和泛型引出variance

S <: T means: S is a subtype of T, and

S >: T means: S is a supertype of T, or T is a subtype of S   注意这个or的描述是一样的,super type 和subtype正好反一下

类型范围举例 [S >: NonEmpty <: IntSet]

S为NonEmpty的父类,但是必须是IntSet的子类

协变举例:

如果说 NonEmpty <: IntSet 那么如果满足  List<NonEmpty>  <: List<IntSet> 的话就称为类型协变

我的理解是这个列表或集合中的任意NonEmpty对象都可以安全转换到IntSet对象

里氏替换原则  A <: B 那么如果行为对B的所有行为可以用A替换B后仍旧成立,因为B的抽象层次高,所以B的所有行为都是从A抽象而来

Lecture 4.3

Pure Object Orientation

举例说明scala纯面向对象的,如何将primitive 类型转化成一个Class

Pure Boollean

关键点在于理解 def ifThenElse [T](t: => T, e: => T): T

还是回到函数就是类,类就是函数的思想上来,所有的类都是可以看成函数的,所以Scala如果是纯函数式语言,那么它也是纯面向对象语言。

把Boolean 对象看做一个递归函数,

if (cond) te

else ee

cond.ifThenElse(te, ee)

如果 false < true 为boolean实现一个  < 的函数实现

<(x:Boolean) ifThenElse( false, x)

如何实现一个自然数,只能用对象和函数不能使用基本类型

abstract class Nat {

def isZero: Boolean

def predecessor: Nat

def successor: Nat

def + (that: Nat): Nat

def - (that: Nat): Nat

}

object Zero extends Nat

class Succ(n: Nat) extends Nat

将一切看成对象,忘记 0, 1,2, 3, 4 这里理解的关键是把自然数看成是一个一个的对象

自然数在这里看做下面的数列

Zero, Succ(Zero), Succ(Succ(Zero)), Succ(Succ(Succ(Zero)))), …

Lecture 4.4 Variance (型变)(老师一开始就说这部分较难,可以略过或只是看看就行)不管对不对,先做些记录吧

型变的定义分三类,在scala中定义如下:

Covariant                协变  class C[+A] { ... }

Contravariant        逆变  class C[-A] { ... }

Nonvariant             (不知道怎么翻译)   class C[A] { … }

练习思考,假设

type A = IntSet => NonEmpty

type B = NonEmpty => IntSet

那么 A和B的关系是?

老师对为什么做了详细解释,使用里氏替换原则。

继续巩固大家的思想,函数即类型,类型即函数的概念。推导出以下公式

如果  A2 <: A1 , B1 <: B2 那么如下函数存在如下型变关系

A1 => B1 <: A2 => B2

Function Trait Declaration

下面引出scala里面认为函数即类型,类型即函数的重要特质  Function1的定义

package scala

trait Function1[-T, +U] {

def apply(x: T): U

}

Variance check (型变检查)

Scala的大致性规则

- 协变一般出现在函数返回类型上

- 逆变一般出现在函数的参数类型上

- 不型变可以出现在任何地方

通过List的例子来说明怎样扩大类型定义时的类型来适应函数返回值的多样类型,Scala居然可以让函数返回自适应类型?对,这是为模式匹配做铺垫啊。

trait List[+T] { ... }

object Empty extends List[Nothing] { ... }

将List返回类型定义为[T+] 来适应NoEmpty  和Empty 两种可能的返回值, 看起来太酷了。

再通过List的一个函数prepend举例说明,当函数返回值和参数如何通过使用协变通过scala编译

返回值 U :> T,  T类型为参数类型, 通过这种方式放大返回值的类型范围。

这里看的似懂非懂,但记住一点真理,scala里面的函数就是类型,类型就是函数

def prepend [U >: T] (elem: U): List[U] = new Cons(elem, this)

def f(xs: List[NonEmpty], x: Empty) = xs prepend x ?

xs prepend x  = new Cons(x, xs) 返回了List <Empty> 所以xs prepend x 的类型为 List<IntSet>

思考:型变好厉害,怎么瞧着和匿名函数有点关系呢? 函数对参数进行运算后发生类型变换,函数即类型,类型即函数才让型变成为可能?

时间: 2024-08-25 00:12:56

函数即对象 Scala (一)的相关文章

javascript 函数与对象

javascript中的函数是非常重要的概念,也是比较难于理解的一个知识点! 下面就来聊聊函数: JS基于对象:什么是基于对象呢?简单的说所有代码都是"对象"; 比如函数: function person(){ } person();//1 调用函数; 比如变量: var  x=5; x=6     // 2 重新为x赋值; 上面的函数和变量都是对象:所有的函数都是Function类的对象,x是Number类的对象.相当于 var x=new Number(5): 注意: functi

python之attrgetter函数对对象排序

1 # 使用attrgetter函数对对象排序 3 # attrgetter处理对象,itemgetter处理序列 4 5 from operator import attrgetter 6 7 8 class user(): 9 def __init__(self, name, age): 10 self.name = name 11 self.age = age 12 13 def __repr__(self): 14 '''定义该对象需要输出时的字符串格式''' 15 return sel

JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象

目录 一.闭包(Closure) 1.1.闭包相关的问题 1.2.理解闭包 二.对象 2.1.对象常量(字面量) 2.2.取值 2.3.枚举(遍历) 2.4.更新与添加 2.5.对象的原型 2.6.删除 2.7.封装 三.函数 3.1.参数对象 (arguments) 3.2.构造函数 3.3.函数调用 3.3.1.call 3.3.2.apply 3.3.3.caller 3.3.4.Callee 3.5.立即执行函数表达式 (IIFE) 3.5.1.匿名函数与匿名对象 3.5.2.函数与函数

2016.8.07 一个自欺欺人的代码(便于理解函数和对象)

之前在对象基础里,我说对象就像游戏里的一个人物,这个人物有血条,魔条,物理攻击力等等的基本属性,也有攻击等基本方法. 在这里,我就写一个小例子,是用来自欺欺人的.真的,随便玩玩就好,如果想认真的做一个回合制游戏,可以参考我这个代码. 不说了,直接上代码: function Person(o){ this.name= o.name; //名字 this.profession= o.profession;//职业 this.rank= o.rank; //等级 this.blood= o.blood

用工厂函数封装对象

工厂函数是在方法中建立一个Object空对象,然后再对此对象添加属性和方法,然后把Object对象返回 <html> <head> <title>工厂函数封装对象</title> <script type="text/javascript"> // 工厂函数模式封装对象 //特点:返回结果为对象的函数,在用工厂函数创建对象的时候,一定要new function fn(nianling){ var obj=new object(

JS函数和对象(一)

在本文章中,将对JS中的函数和对象进行一些讲解,不对之处还请之处 一.JS中的函数 1.1无参函数 其形式如下代码所示 function box(){ alert("我是一个函数,只有被调用才会执行"); } box(); 运行结果如图1.1 图1.1 1.2有参函数 有参函数其形式如下 function box(name,age){ alert("你的名字是"+name+",年龄为"+age); } box("李大宝",22

avaScript学习总结(二)——闭包、IIFE、apply、函数与对象 目录

一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div,for循环绑定事件. 示例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>闭包</title> <style type="

1,对象的存储细节,2,#pragma mark指令,3,函数和对象方法的区别,4,对象和方法之间的关系 ,5.课堂习题

1,对象的存储细节, 1. 当创建一个对象的时候:Person *p1 = [Person new],做了三件事情: 1,申请堆内存空间: 2,给实例变量初始化: 3,返回所申请空间的首地址; 2. 实例变量保存在堆区 3. 对象方法保存在代码区 4. 一个类可以创建多个对象: 2,#pragma mark指令, 功能:对代码分组,方便代码查找和导航 使用格式: #pragma mark - #waring 等待处理的功能,或者是未完成的功能 3,函数和对象方法的区别, 一. 对象方法: -(v

理解javascript原型和作用域系列(2)——函数和对象的关系

上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; console.log(fn instanceof Object); // true 对!函数是一种对象,但是函数却不像数组一样——你可以说数组是对象的一种,因为数组就像是对象的一个子集一样.但是函数与对象之间,却不仅仅是一种包含和被包含的关系,函数和对象之间的关系比较复杂,甚至有一点鸡生蛋蛋生鸡的逻辑