Week 1

Cheat Sheet

Evaluation Rules

  • Call by value: evaluates the function arguments before calling the funtion
  • Call by name: evaluates the function first, and then evaluates the arguments if need be
  • val example = 2    // evaluated immediately
    def example = 2 //evaluated when called
    laze val example = 2 // evaluated once when needed def square(x : Double) // call by value
    def square(x: => Double) // call by name
    def myFct(bindings: Int*) = { ... } // bindings is a sequence of int, containing a varying # of arguments

Higher order functions

  • Higher order functions are functions that take a function as a paremeter or return functions.
  • // sum() returns a function that takes two integers and returns an integer
    def sum(f: Int => Int): (Int, Int) => Int = {
    def sumf(a: Int, b: int): Int = {...}
    sumf
    } // same as above. Its type is (Int => Int) => (Int, Int) => Int
    def sum(f: Int => Int)(a: Int, b: Int): Int = {...} // called like this
    sum((x: Int) => x * x * x) // Anonymous function, i.e. does not have a name
    sum(x => x * x * x) // Same anonymous function with type inferred def cube(x: Int) = x * x * x
    sum(x => x * x * x)(1, 10) // sum of cubes from 1 to 10
    sum(cube)(1, 10) // same as above

Currying

  • Curring is converting a function with multiple arguments into a function with a single argument that returns another function.
  • def f(a: Int, b: Int): Int    // uncurried version(type is (Int, Int) => Int)
    def f(a: Int)(b:Int): Int // curried version(type is Int => Int => Int)

Classes

  • class MyClass(x: Int, y: Int) {
    require(y > 0, "y must be positive") // precondition, triggering an IllegalArgumentException if not met def this(x: Int) = {...} // auxiliary construtor def nb1 = x // public method computed every time it is called
    def nb2 = y private def test(a: Int): Int = {...} val nb3 = x + y // computed only once
    override def toString = member1 + "," + member2
    } new MyClass(1, 2)

Class hierarchies

  • to create an runnable application in scala

    object Hello {
    def main(args: Array[String]) = println("H")
    } // or object Hello extends App {
    println("H")
    }

Class Organization

  • Classes and objects are organized in pakages.
  • Traits are similar to Java interfaces, except they can have non-abstract members:trait Planar { ... } class Square extends Shape with Planar.
  • General object hierarchy:
    • scala.Any is base type of all types. Has methods hashCode and toString that can be overridden.
    • scala.AnyVal is base type of all primitive types, such as scala.Double, scala.Float, etc.
    • scala.AnyRef is base type of all reference types. Alias of java.lang.Object, supertype of java.lang.String, scala.List, any user-defined class.
    • scala.Null is a subtype of scala.AnyRef(null is the only instance of type Null), and scala.Nothing is a subtype of any other type without any instance.

Pattern Matching

  • Pattern matching is used for decomposing data structures.

    unknownObject match {
    case MyClass(n) => ...
    case MyClass2(a, b) => ...
    } (someList: List[T]) match {
    case Nil => ... // empty list
    case x :: Nil => ... // list with only one element
    case List(x) => ... // same as above
    case x :: xs => ... // a list with at least one element. x is bound to the head, xs to the tail. xs could be Nil or some other list
    case 1 :: 2 :: cs => ... // list that starts with 1 and then 2
    case (x, y) :: ps) => ... // a list where the head element is a pair
    case _ => ... // default case if none of the above matches
    }

Options

  • Pattern matching can also be used for Option values.
  • Some functions (like map.get) return a value of type Option[T] which is either a value of the type Some[T] or the value None
    val myMap = Map("a" -> 42, "b" -> 43)
    def getMapValue(s: Stringf): String = {
    myMap get s match {
    case Some(nb) => "Value found: " + nb
    case None => "None value found"
    }
    } getMapValue("a") // "Value found: 42"
    getMapValue("c") // "No value found"
  • Most of the times when u write a pattern match on an option value, the same expression can be written more concisely using combinator methods of the Option class. Eg:
    def getMapValue(s: String): String = myMap.get(s).map("Value found: " + _).getOrElse("No value found")

Pattern Matching in Anonymous Functions

  • val pairs: List[(Char, Int)] = ('a', 2) :: ('b', 3) :: Nil
    val chars: List[Char] = pairs.map(p => p match {
    case (ch, num) => ch
    }) // or instead:
    val chars: Lits[Char] = pairs map {
    case (ch, num) => ch
    }

Collections

  • Scala defines several collection classess

Base Classes

  • Iterable (collections u can iterate on)
  • Seq (ordered sequences)
  • Set
  • Map

Immutable Collections

  • List (linked list, provides fast sequential access)
  • Stream (same as List, expect the tail is evaluated only on demand)
  • Vector (array-like type, implemented as tree of blocks, provides fast random access)
  • Range (ordered sequence of integers with equal spacing)
  • String (Java type, implicitly converted to a character sequence, so you can treat every string like a Seq[Char])
  • Map (collection that maps keys to values)
  • Set (collection without duplicate elements)

Mutable Collections

  • Array (Scala arrays are native JVM arrays at runtime, therefore they are very performant)
  • Scala also has mutable maps and sets; these should only be used if there are performance issues with immutable types
  • Demo Usage:
    val fruitList = List("apples", "oranges", "pears")
    // Alternative syntax for lists
    val fruit = "apples" :: ("oranges" :: ("pears" :: Nil)) // :: is right-associative
    fruit.head // "apples"
    fruit.tail // List("oranges", "pears") val empty = List()
    val emtpty = Nil val nums = Vector("louis", "frank", "hiromi")
    nums(1) // element at index 1, returns "frank", O(logn) time
    nums.updated(2, "helena") // new vector with a different string at index 2, complexity O(log(n)) val fruitSet = Set("apple", "banana", "pear", "banana")
    fruitSet.size // returns 3 val r: Range = 1 until 5 // 1, 2, 3, 4
    val s: Range = 1 to 5 // 1, 2, 3, 4, 5
    1 to 10 by 3 // 1, 4, 7, 10 val s = (1 to 6).toSet
    s map (_ + 2) // adds 2 to each element of the set val s = "Hello"
    s filter(c => c.isUpper) // returns "H" // Operations on sequences
    val xs = List(...)
    xs.length
    xs.last // last element (exception if xs is empty), O(n) time
    xs.init // all elements of xs but the last (exception if xs is empty), O(n) time
    xs take n // first n elements of xs
    xs drop n // the rest of the collection after taking n elements
    xs(n) // the nth element of xs, O(n) time
    xs ++ ys // concatenation, complexity O(n)
    xs zip ys // returns a list of pairs which groups elements with same index together
    xs unzip // opposite of zip: returns a pair of two lists
    xs.flatMap f // applies the function to all elements and concatenates the result
    x +: xs // creates a new collection with leading element x
    xs :+ x // creates a new collection with trailing element x

Pairs

  • val pair = ("answer", 42)
    val (label, value) = pair
    pair._1
    pair._2

[Scala] [Coursera]的更多相关文章

  1. 【原】Scala学习资料

    Scala是基于JVM的一种通用函数式也是面向对象编程语言,能和Java.C#等主流的编程语言无缝融合. 下面给大家推荐一些Scala的学习资料,序号靠前的重要性比较高. 1.Scala初学指南 (1 ...

  2. Scala 学习笔记(1)之入门篇

    Scala is pronounced skah-lah. Scala 全称为 scalable language,是一种面向对象(object)- 函数式(functional)静态类型(stati ...

  3. Coursera公开课Functional Programming Principles in Scala习题解答:Week 2

    引言 OK.时间非常快又过去了一周.第一周有五一假期所以感觉时间绰绰有余,这周中间没有假期仅仅能靠晚上加周末的时间来消化,事实上还是有点紧张呢! 后来发现每堂课的视频还有相应的课件(Slide).字幕 ...

  4. Coursera scala课程第一周答案

    Exercise 1: Pascal's Triangle The following pattern of numbers is called Pascal's triangle. 1 1 1 1 ...

  5. Scala初探:新潮的函数式面向对象语言

    Scala的基本概念 先讲讲Scala里头几个概念Classes, Traits, Objects and Packages. Class和Java中的很像,只不过Scala中Class不能有stat ...

  6. Scala 中的函数式编程基础(三)

    主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...

  7. Scala 中的函数式编程基础(二)

    主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...

  8. Scala 中的函数式编程基础(一)

    主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ...

  9. mac平台scala开发环境搭建

    到scala官网,下载scala的sdk,地址:http://www.scala-lang.org/download/ adeMacBook-Pro:scala- apple$ wget http:/ ...

随机推荐

  1. servlet injection analysis

    一. Spring不能通过注解向Servlet中注入实例的原理 想了解此问题的原理,就要了解tomcat启动后 servlet和spring的加载顺讯. 1.  tomcat启动后先加载web.xml ...

  2. 泛型-----键值对----映射 hashmap--entry中key value 链表

    connection map 集合框架 * java.util.Collection *集合与数组相似,也是可以保存一组元素,并且提供了操作元素的相关方法. *collection是所有集合的顶级接口 ...

  3. numpy linalg模块

    # 线性代数# numpy.linalg模块包含线性代数的函数.使用这个模块,可以计算逆矩阵.求特征值.解线性方程组以及求解行列式等. import numpy as np # 1. 计算逆矩阵# 创 ...

  4. 使用Angular2的Http发送AJAX请求

    使用Angular2的Http发送AJAX请求 Angular的文档并不详细,甚至API文档也有一些错误.经过查阅资料并经大量实验,终于明确了Angular的Http发送Ajax请求的方式方法.本文描 ...

  5. springboot项目打成war包

    在某种情况下,比如..........之下,我们不得不,将springboot打成war包 1.在pom.xml文件中修改 <packaging>war</packaging> ...

  6. UI自动化(八)xpath

    由于最新版火狐不在支持FireBug等开发工具,可以通过https://ftp.mozilla.org/pub/firefox/releases/下载49版本以下的火狐就可以增加Firebug等扩展了 ...

  7. CEF 设置Cookie

    参考文档:http://magpcss.org/ceforum/apidocs3/projects/(default)/CefCookieManager.html 转载:https://www.cnb ...

  8. 尚硅谷面试第一季-17Redis 在项目中的使用场景

    数据类型 使用场景 String 比如说 ,我想知道什么时候封锁一个IP地址.Incrby命令 Hash 存储用户信息[id,name,age] Hset(key,field,value) Hset( ...

  9. CSS的再深入5(更新中···)

    页面布局 结构层:搭我们的页面框架. 布局层:针对框架内部结构进行排版. 不需要使用浮动解决的问题尽量不用. 使用浮动之后会使该元素脱标,并且该元素的margin. div 盒子模型 : 就是一个容器 ...

  10. JavaScript闭包函数&箭头函数调用与执行

    一.标准的闭包函数 //一.标准的闭包函数 function A() { var i=0; ++i; console.log('i : ' + i); return function b() { re ...