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. 用 python 生成一个简单的词云图

    import jieba from nltk import * from wordcloud import WordCloud import matplotlib.pyplot as plt word ...

  2. Mysql 书写语句时避免出现关键字导致报错 关键字大全

    ADD ALL ALTER ANALYZE AND AS ASC ASENSITIVE BEFORE BETWEEN BIGINT BINARY BLOB BOTH BY CALL CASCADE C ...

  3. Linux下系统时间函数、DST等相关问题总结(转)

    Linux下系统时间函数.DST等相关问题总结 下面这个结构体存储了跟时区相关的位移量(offset)以及是否存在DST等信息,根据所在的时区信息,很容易找到系统时间与UTC时间之间的时区偏移,另外根 ...

  4. Java连接数据库 #05# SQL与代码分离

    索引 读取html中的SQL语句 缺陷总结 在Java连接数据库 #04#里大概是这样放sql语句的: package org.sample.shop.db.queryrunner; import o ...

  5. 性能测试监控工具nmon详解和分析

    性能测试监控工具nmon详解和分析 1.命令安装 1.查看liunx版本版本x86_64_14i 目录:cd /nmon/logs/ 版本x86_64_14i [root@localhost u06] ...

  6. es日常维护

    1.查看es日志curl -XGET http://10.26.41.60:9200/xdm-logs-2018.08.22?pretty=true 2.删除es日志curl -XDELETE 'ht ...

  7. 分类统计的controller和service

    SpringMVC框架下的 部分代码: Controller控制器: @Resource ReviewTitleService reviewTitleService;//调用ReviewTitleSe ...

  8. iOS开发 -------- storyBoard实现控制器添加childViewController

    1 拖进去scrollView 添加约束(0,0,0,0);     2 更新scrollView约束,然后在scrollView上面加个view,设置其约束为(0,0,0,0) 和 水平滑动约束; ...

  9. Vue父子组件传值 | 父传子 | 子传父

    父传子 父容器 <template> <div> <zdy :module='test'></zdy> </div> </templa ...

  10. CSS【04】:CSS组合选择器

    组合选择器 群组(并集)选择器 作用:给所有选择器选中的标签设置属性,可以同时控制多个选择器 格式: 选择器1, 选择器2 { 属性: 值; } 注意点: 必须使用,来连接 选择器可以使用标签名称.i ...