[Scala] [Coursera]
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]的更多相关文章
- 【原】Scala学习资料
		Scala是基于JVM的一种通用函数式也是面向对象编程语言,能和Java.C#等主流的编程语言无缝融合. 下面给大家推荐一些Scala的学习资料,序号靠前的重要性比较高. 1.Scala初学指南 (1 ... 
- Scala  学习笔记(1)之入门篇
		Scala is pronounced skah-lah. Scala 全称为 scalable language,是一种面向对象(object)- 函数式(functional)静态类型(stati ... 
- Coursera公开课Functional Programming Principles in Scala习题解答:Week 2
		引言 OK.时间非常快又过去了一周.第一周有五一假期所以感觉时间绰绰有余,这周中间没有假期仅仅能靠晚上加周末的时间来消化,事实上还是有点紧张呢! 后来发现每堂课的视频还有相应的课件(Slide).字幕 ... 
- Coursera scala课程第一周答案
		Exercise 1: Pascal's Triangle The following pattern of numbers is called Pascal's triangle. 1 1 1 1 ... 
- Scala初探:新潮的函数式面向对象语言
		Scala的基本概念 先讲讲Scala里头几个概念Classes, Traits, Objects and Packages. Class和Java中的很像,只不过Scala中Class不能有stat ... 
- Scala 中的函数式编程基础(三)
		主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ... 
- Scala 中的函数式编程基础(二)
		主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ... 
- Scala 中的函数式编程基础(一)
		主要来自 Scala 语言发明人 Martin Odersky 教授的 Coursera 课程 <Functional Programming Principles in Scala>. ... 
- mac平台scala开发环境搭建
		到scala官网,下载scala的sdk,地址:http://www.scala-lang.org/download/ adeMacBook-Pro:scala- apple$ wget http:/ ... 
随机推荐
- VSCode 打开文件tab键空格数量异常问题
			[1]现象与原因 现象:用Notepad++打开文件,tab键占4个空格键.但是,用VSCode打开,tab键缺变成了3个空格键. 原因:因为VSCode默认启用了根据文件类型自动设置tabsize的 ... 
- python locust 性能测试:locust 参数化(list) ---循环取数据,数据可重复使用
			from locust import TaskSet, task, HttpLocust class UserBehavior(TaskSet): def on_start(self): # 当模拟用 ... 
- Shellcode入门
			Shellcode入门 一.shellcode基础知识 Shellcode实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限.另外,Shellcode一般是作为 ... 
- vue组件传值
			组件的传值(组件之间的通讯) 1.父子通信 1)父传子 传递:当子组件在父组件中当做标签使用的时候,通过给子组件绑定一个自定义属性,值为需要传递的数据 接收:在子组件内部通过props进行接收 接收的 ... 
- 解决ajax异步请求数据后swiper不能循环轮播(loop失效)问题、滑动后不能轮播的问题。
			问题描述: 1.我使用axios异步请求后台的图片进行渲染后不能实现循环轮播,也就是loop失效,但是静态写死的情况下不会出现这种问题. 2. 分析: swiper的机制是:初始化的时候将swiper ... 
- gets() 与 scanf() 的小尴尬
			gets() 与 scanf() 函数相处呢有点小尴尬的,就是 gets() 在 scanf() 后边就爱捣乱.为什么呢,先了解它们两者之间的异同: 同: 都是可以接受连续的字符数据 并在字符结束后自 ... 
- Pandas 基础(6) - 用 replace() 函数处理不合理数据
			首先, 还是新建一个 jupyter notebook, 然后引入 csv 文件(此文件我已上传到博客园): import pandas as pd import numpy as np df = p ... 
- vue-循环并获取dom元素
			<ul class="picBox"> <li v-for="(item,index) in picArr" ><img :src ... 
- Fastjson-fastjson中$ref对象重复引用问题:二
			import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSON; import com.alib ... 
- Node.js的缺陷
			Node.js最大的优点是事件机制,一切皆在回调中触发(不阻塞).我想缺点或许有正在于此,方法没有返回值,而只能在回调中使用返回结果,会导致事件回调嵌套,代码结构很差. 在jQuery中有一套很好的机 ... 
