Unformatted text preview:

Getting FunctionalWhat is Functional Programming (FP)?Creating ListsNil and ::head, tail, and isEmptytake, drop, and splitAttoString and mkStringzip and unzipHigher-order functionsAbbreviationssortWithforall and existsforeachLeast upper boundClosuresmapflatMapfilterSome Map methodsAnother Map method“Houston, we have a problem.”The EndGetting Functional2What is Functional Programming (FP)?In FP,Functions are first-class objects. That is, they are value s, just like other objects are values, and can be treated as suchFunctions can be assigned to variables, passed as parameters to higher-order functions, returned as results of functionsThere is some way to write function literalsFunctions should only transform their inputs into their outputsA function should have no side effectsIt should not do any input/outputIt should not change any state (any external data)Given the same inputs, a function should produce the same outputs, every timeBut we need random numbers, date and time, etc.Functions have referential transparency—any given function call could safely be replaced by the function’s result23Creating Listsscala> List('a', 'b', 'c')res0: List[Char] = List(a, b, c)scala> "abc" toListres1: List[Char] = List(a, b, c)scala> "Welcome to Scala" split(" ")res2: Array[java.lang.String] = Array(Welcome, to, Scala)scala> val scala = "Scala" toListscala: List[Char] = List(S, c, a, l, a)scala> "Hello" :: scalares3: List[Any] = List(Hello, S, c, a, l, a)34Nil and ::scala> List()res4: List[Nothing] = List()scala> Nilres5: scala.collection.immutable.Nil.type = List()scala> List() == Nilres6: Boolean = truescala> List[String]()res7: List[String] = List()scala> "xyz" :: Nilres8: List[java.lang.String] = List(xyz)scala> "abc" :: "xyz" :: Nilres9: List[java.lang.String] = List(abc, xyz)45head, tail, and isEmptyscala> val penn = "Pennsylvania" toListpenn: List[Char] = List(P, e, n, n, s, y, l, v, a, n, i, a)scala> penn headres10: Char = Pscala> penn tailres11: List[Char] = List(e, n, n, s, y, l, v, a, n, i, a)scala> penn isEmptyres12: Boolean = falsescala> Nil isEmptyres13: Boolean = truescala> Nil headjava.util.NoSuchElementException: head of empty list (plus many more lines!)56take, drop, and splitAtscala> pennres16: List[Char] = List(P, e, n, n, s, y, l, v, a, n, i, a)scala> penn take 4res17: List[Char] = List(P, e, n, n)scala> penn drop 4res18: List[Char] = List(s, y, l, v, a, n, i, a)scala> penn splitAt 4res19: (List[Char], List[Char]) = (List(P, e, n, n),List(s, y, l, v, a, n, i, a))scala> penn.splitAt(4)res20: (List[Char], List[Char]) = (List(P, e, n, n),List(s, y, l, v, a, n, i, a))67toString and mkStringscala> List(1, 2, 3).toStringres25: String = List(1, 2, 3)scala> List(1, 2, 3).toString == "List(1, 2, 3)"res26: Boolean = truescala> List(1, 2, 3) mkString(" is less than ")res27: String = 1 is less than 2 is less than 3scala> List(1, 2, 3) mkString("*")res28: String = 1*2*3scala> List(1, 2, 3) mkString("<: ", "--", " :>")res29: String = <: 1--2--3 :>scala> List(1, 2, 3) mkString("(", ", ", ")")res30: String = (1, 2, 3)78zip and unzipscala> val words = "one two three" split " "words: Array[java.lang.String] = Array(one, two, three)scala> val numbers = List(1, 2, 3, 4, 5)numbers: List[Int] = List(1, 2, 3, 4, 5)scala> val z = words zip numbersz: Array[(java.lang.String, Int)] = Array((one,1), (two,2), (three,3))scala> val zz = numbers zip wordszz: List[(Int, java.lang.String)] = List((1,one), (2,two), (3,three))scala> z toMapres31: scala.collection.immutable.Map[java.lang.String,Int] = Map((one,1), (two,2), (three,3))scala> zz unzipres32: (List[Int], List[java.lang.String]) = (List(1, 2, 3),List(one, two, three))89Higher-order functionsThe basic syntax of a function literal is parameter_list => function_bodyA higher-order function is one that takes a function as a parameter, or returns a function as a resultscala> val brag = "Scala is great!" toListbrag: List[Char] = List(S, c, a, l, a, , i, s, , g, r, e, a, t, !)scala> brag count((ch: Char) => ch == 'a')res34: Int = 3scala> brag count((ch: Char) => !(ch isLetter))res35: Int = 3scala> "Scala is great!".toList.count((ch: Char) => ch < 'f')res36: Int = 9scala> "aeiou" contains 'e'res37: Boolean = truescala> "Scala is great!".toList.count((ch: Char) => "aeiou" contains ch)res38: Int = 5910AbbreviationsIn a literal function, you can usually omit the type (and, if there’s only one parameter, the parentheses)scala> bragres40: List[Char] = List(S, c, a, l, a, , i, s, , g, r, e, a, t, !)scala> brag count((ch: Char) => ch == 'a')res41: Int = 3scala> brag count (ch => ch == 'a')res42: Int = 3In fact, if there is only one parameter, used once, you can omit the parameter and the => and just use _ to stand in for the parameterscala> brag count (_ == 'a')res44: Int = 3Let me repeat that: Used oncescala> brag count (_ == 'a' || _ == 'e')<console>:7: error: wrong number of parameters; expected = 1 brag count (_ == 'a' || _ == 'e')1011sortWithscala> brag sortWith((x, y) => x < y)res49: List[Char] = List( , , !, S, a, a, a, c, e, g, i, l, r, s, t)Since there are two parameters, we can use two underscoresscala> brag sortWith (_ < _)res50: List[Char] = List( , , !, S, a, a, a, c, e, g, i, l, r, s, t)Order matters!scala> brag sortWith (_ > _)res52: List[Char] = List(t, s, r, l, i, g, e, c, a, a, a, S, !, , )1112forall and existsWhereas count returns an Int, forall and exists return a Booleanscala> val n = List(3, 1, 4, 1, 6)n: List[Int] = List(3, 1, 4, 1, 6)scala> n forall(x => x < 8)res53: Boolean = truescala> n forall(x => x < 5)res54: Boolean = falsescala> n exists(_ < 5)res55: Boolean = truescala> n exists(_ > 8)res56: Boolean = false1213foreachforeach returns the (uninteresting) Unit valuescala> val brag = List("Scala", "is", "great!")brag: List[java.lang.String] = List(Scala, is, great!)scala> brag foreach (println(_))Scalaisgreat!scala> brag foreach(println)Scalaisgreat!scala> List(3, 1, 4, 1, 6) foreach (x => if (x > 1) println(x))3461314Least upper boundThe following list contains only integers:scala> val list = List(1, 2, 3)list:


View Full Document

Penn CIS 700 - Getting Functional

Documents in this Course
Lists

Lists

19 pages

Actors

Actors

30 pages

Load more
Download Getting Functional
Our administrator received your request to download this document. We will send you the file to your email shortly.
Loading Unlocking...
Login

Join to view Getting Functional and access 3M+ class-specific study document.

or
We will never post anything without your permission.
Don't have an account?
Sign Up

Join to view Getting Functional 2 2 and access 3M+ class-specific study document.

or

By creating an account you agree to our Privacy Policy and Terms Of Use

Already a member?