Tuesday, May 20, 2014

scala课堂:Concurrence in Scala


  • Runnable/Callable
    • Runnable接口只有一个没有返回值的方法。
    • Callable与之类似,除了它有一个返回值。
  • 线程
    • scala并发是建立在java并发模型基础上的。
    • 一个线程需要一个Runnable。你必须用线程的start方法来运行Runnable。
  • Executors
    • 你可以通过Executors对象的静态方法得到一个ExecutorService对象。
  • Futures
    • Future代表异步计算。
    • 你可以把你的计算包装在Future中,当你需要计算结果的时候,你只需要调用一个阻塞的get()方法就可以了。
    • 一个FutureTask是一个Runnable实现,就是被设计为由Executor运行的。
  • 线程安全问题
    • 三种工具
      • 同步:互斥锁(Mutex)提供所有权语义。
      • volatile:synchronized云溪更细粒度的锁,而volatile则对每次访问同步。
      • AtomicReference
      • 这个成本是什么?synchronized往往是最好的选择。
      • CountDownLatch
      • AtomicInteger/Long
      • AtomicBoolean
      • ReadWriteLocks

scala课堂:More collections


  • 基础知识
    • 表 List
    • 集 Set
    • 序列 Seq
    • 映射 Map
  • 层次结构
    • Traversable
    • Iterable
    • Seq 序列
    • Set 集
    • Map
  • 常用的子类
    • HashSet和HashMap的快速查找,这些集合的最常用的形式。
    • TreeMap是SortedMap的一个子类,它能让你进行有序访问。
    • Vector快速随机选择和快速更新。
    • Range等间隔的Int有序序列。你经常会在for循环看到。
    • Ranges支持标准的函数组合子。
  • 一些描述性的特质
    • IndexSeq快速随机访问元素和一个快速的长度操作。
    • LinearSeq通过head快速访问第一个元素,也有一个快速的tail操作。
  • 可变集合
    • HashMap定义了getOrElseUpdate,+=

scala课堂:高级类型


  • 视界(“类型类”)
    1. 一个视界指定一个类型可以被“看作是”另一个类型。这对对象的只读操作是很有用的。
    2. 隐函数允许类型自动转换。更确切的说,在隐式函数可以帮助满足类型推断时,它们允许按需的函数应用。
    3. 视界,就像类型边界,要求对给定的类型存在这样一个函数。你可以使用<%指定类型限制。
  • 其他类型限制
    1. 方法可以通过隐含参数执行更复杂的类型限制。
    2. 使用视图进行泛型编程。
    3. 上下文边界和implicitly[]。
  • 更高级多态性类型和特设多态性
    1. scala可以对“更高阶”的类型进行抽象。
  • F-界多态性
  • 结构类型
  • 抽象类型成员
  • 类型擦除和清单
这部分和上部分的很多内容还不理解,后续需查阅其他资料学习。

scala课堂:类型与多态基础


  • 什么是静态类型?它们为什么有用?
    1. 类型允许你表示函数的定义域和值域。
  • scala中的类型
    1. 参数化多态性
    2. 类型推断
    3. 存在量化
    4. 视窗
  • 参数化多态性:
    1. 多态性是在不影响静态类型丰富性的前提下,用来编写通用代码的。
    2. scala有秩1多态性。
  • 类型推断
    1. scala中所有类型推断是局部的
  • 变性 Variance
    1. scala的类型系统必须同时解释类层次和多态性。类层次结构可以表达子类关系。
    2. 变性注解允许你表达类层次结构和多态类型之间的关系。
  • 边界
    1. scala允许你通过边界来限制多态变量。
  • 量化

scala课堂:模式匹配与函数组合


  • 函数组合
    1. 让我们创建两个函数:f(x)和g(x)。
    2. compose:compose组合其他函数形成一个新的函数f(g(x))。
    3. andThen:andThen和compose很像,但是调用顺序是先调用第一个函数,然后调用第二个,即g(f(x))。
  • 柯里化 vs 偏应用
    1. case语句是一个名为PartialFunction的函数的子类。
    2. 多个case语句的集合是共同组合在一起的多个PartialFunction。
  • 理解PartialFunction(偏函数)
    1. 对给定的输入参数类型,偏函数只能接受该类型的某些特定的值。
    2. isDefinedAt是PartialFunction的一个方法,用来确定PartialFunction是否能接受一个给定的参数。
    3. 主要偏函数和我们前面提到的部分应用函数是无关的。
    4. case之谜!

Thursday, May 15, 2014

统计检定 Part1


  • 目的
    1. 根据样本资讯,检定关于一个或多个群体参数值之假说。
  • 统计检定之五大步骤
    1. 设立
      1. 虚无假说 Ho
      2. 对立假说 Ha
    2. 指定显著水准
    3. 决定适当之检定统计量
    4. 决定弃却域
    5. 下结论
  • 假说
    1. 关于一个或多个群体参数值的一段叙述。
      1. 对立假说 Alternative Hypothesis
      2. 虚无假说 Null Hypothesis
      3. 虚无假说为对立假说的相反
    2. 注意:
      1. 永远先设立Ha
      2. “=”只能放在Ho
  • 如何设立假说
  • 假说检定之种类
    1. 单边检定
    2. 双边检定
  • 两种可能的误差
    1. 型一误差:当Ho是对的,检定结果却判断其为错的,而推翻Ho。
    2. 型二误差:当Ho是错的,检定结果却判断其为对的,而不推翻Ho。
  • 显著水准 (Level of Significance)

scala课堂 集合


  • 基本数据结构
    1. 列表 List
    2. 集 Set:集没有重复。
    3. 元组 Tuple 
      1. 元组是在不使用类的前提下,将元素组合起来形成简单的逻辑集合。
      2. 使用位置下标来读取对象,而且这个下标基于1。
      3. 元组可以很好的与模式匹配相结合。
      4. 在创建两个元素的元组时,可以使用特殊语法:->
    4. 映射 Map
      1. 它可以持有基本数据类型。
      2. 映射的值可以是映射甚至是函数。
    5. 选项Option
      1. Option是一个表示有可能包含值的容器。
      2. Option本身是泛型的,并且有两个子类:Some[T]或None。
      3. 我们建议使用getOrElse或模式匹配处理这个结果,getOrElse让你轻松定义一个默认值。
  • 函数子(Functional Combinators)
    1. map:对列表中的每个元素应用一个函数,返回应用后的元素所组成的列表。
    2. foreach:
      1. 很像map,但没有返回值。
      2. foreach仅用于有副作用(side-effects)的函数。
    3. filter:移除任何对传入函数计算结果为false的元素。
    4. zip:将两个列表的内容聚合到一个对偶列表中。
    5. partition:将使用给定的的谓词函数分割列表。
    6. find:返回集合中的一个匹配谓词函数的元素。
    7. drop & dropWhile:
      1. drop将删除前i个元素。
      2. dropWhile将删除元素直到找到的一个匹配谓词函数的元素。
    8. foldLeft:0为初始值,m作为一个累加器。
    9. foldRight:和foldLeft一样,只是运行过程相反。
    10. flatten:将嵌套结构扁平化为一个层次的集合。
    11. flatMap:
      1. 是一种常用的组合子,结合映射[mapping]和扁平化[flattening]。
      2. flatMap需要一个处理嵌套列表的函数,然后将结果串联起来。
      3. 可以把它看做是“先映射后扁平化”的快捷操作。
    12. 扩展函数组合子:上面所展示的每一个函数组合子都可以用fold方法实现。
    13. Map?
      1. 所有展示的函数组合子都可以在Map上使用。
      2. Map可以被看作是一个二元组的列表,所以你写的函数要处理一个键和值的二元组。