Scala programming language
Created:
See Also: Scala for Datascience, ScalaJS, coursier, select-scala
July, 2015 – Scala book reviews Feb, 2018 – Recursion and Trampolines in Scala
Random Notes
scala-cli—power repl -S 2.13 -A —ammonite-ver 2.5.11
Notes from Programming in Scala
Chapter 7 - built-in control structures.
- has very few control structures
if while for try match
and function calls.- scala accumulates control structs in libraries.
- use
val
instead ofvar
wherever possible. makes it easy to refactor. “equational reasoning”. - no
=
sign while defining a function => returns aUnit
value()
while
anddo-while
are NOT expressions. they returnUnit
.- prefer NOT to use while.
- for
- “generator” syntax –
file <- files
. works on all collections. file
is aval
.Ranges
–1 to 4
(yields 1,2,3,4)1 until 4
– exlcude the upper bound (yields 1,2,3)- generators can also include filters –
for (f <- files if f.getName.endsWith('.py'))
- nested iteration.
- mid-stream variable bindings
- new collection:
def pyFiles =
for {
<- files
file if file.getName.endsWith('.py')
} yield file
- IMP: don’t put
yield
inside the curlies.
Exceptions:
try {
} catch {
case ex: FileNotFoundException => //handle
case ex: IOException => //handle
}
- like other control structures,
try-catch-finally
also results in a value. (this is unlike Java) //imp
Match:
val fruit =
match {
someArg case "foo" => "bar"
case "banana" => "pepper"
case _ => "what?"
}
Chapter 8- Functions and Closures
First class functions
(x: Int) => x+1
named function:
var increase = (x: Int) => x + 1
- target typing:
someNumbersList.filter((x) => x > 0)
. the type is inferred from the the list of integers. - alternatively:
someNumbersList.filter(x => x > 0)
Placeholder syntax:
.filter( _ > 0) someNumbersList
val f = (_: Int) + (_: Int)
Chapter 12 – Traits
Traits are like java interfaces with concrete methods + declare fields and maintain state.
Traits can do everything classes can do, except –
- trait cannot have any clas parameters (ie., those passed to primary constructors).
super
calls are not statically bound.
Unlike Java, adding a concrete method to scala trait is an one-time effort.
Chapter 15 – Case classes and pattern matching
Notes from “Scala in Action”
Chapter 2 – Getting started
// working with arrays and Lists
@ val nList = 1 :: 2 :: 3 :: 4 :: Nil
nList: List[Int] = List(1, 2, 3, 4)
@ nList.fil
filter filterNot
@ nList.filter( _ > 2)
res17: List[Int] = List(3, 4)
@ // for comprehensions
@ oldList
res19: List[Int] = List(1, 2)
@ newList
res20: List[Int] = List(1, 2, 3)
@ for { a <- oldList; b <- newList } println (a+b)
2
3
4
3
4
5
@ // above is imperative form
@ // The functional form for comprehension is:
@ // also called the sequence composition
@ for { a <- oldList; b <- newList } yield a+b
res22: List[Int] = List(2, 3, 4, 3, 4, 5)
@ // Pattern Matching
@ val x = 3
x: Int = 3
@ def ordinal(number: Int): Unit = number match {
case 0 => println("One")
case 1 => println("Two")
case 2 => println("Three")
case 3 => println("Four")
case _ => println("what is this?")
}
defined function ordinal
@ ordinal(x)
Four
@ // Pattern Matching Types
@ dBef printType(obj: AnyRef) = obj match {
case s: String => println("This is a string")
case i: java.util.Date => println("This is a Date")
case l: List[_] => println("An array eh?")
case _ => println("dunno who ye are")
}
defined function printType
@ printType(List(1,1,2))
An array eh?
// Guards
@ def numCatcher(num: Int): Unit = num match {
case x if x < 10 => println("Number less than 10")
case y if (y%2 == 0) => println("Is an even number")
}
defined function numCatcher
@ numCatcher(5)
Number less than 10
@ numCatcher(12)
Is an even number
Miscellaneous notes
sbt plays an important role in the day to day programming of scala. I believe ‘sbt’ stood for “scala build tool” at one time, but is no longer.
To start working on a scala program, you can start with a simple text editor, however using something like IntelliJ IDEA is probably far more productive.
Creating a “project structure” can be automated. Essentially this
boilBs down to creating the build.sbt
file,
project
directory and optional plugins.sbt
file inside it, a scala file inside the proper
src/main/scala/com/example/projectname/
directory etc.,
There is little reason to do all this manually, except when you are
trying to understand the reason behind such a recommended directory
layout.
giter8
ie., the g8
is a tool that can create a project structure
based on pre-defined
templates. Think of this as paster
tool for Python.
When you have g8
installed, creating a new project (say,
a basic scala project using this
template ), all you have to do is:
$ g8 fayimora/basic-scala-project.g8
A basic scala project
name [Basic Project]: basic-scala
organization [com.example]: com.btbytes
version [0.0.1]:
Template applied in ./basic-scala
$ cd basic-scala
$ ls
build-sbt src
$ sbt run
will download the dependencies defined in the
build.sbt
file,B compile source and run the program.
sbt can also create the files necessary to make this an “IntelliJ
IDEA project”. For this, we add a dependency to the
plugins.sbt
file:
#project/plugins.sbt -- add this line
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")
Running sbt gen-idea
will generate the IDEA project
files (.idea
, some .iml
).
Launch up IDEA and “open project” and open the root directory of the project. You are now set to work on the code.
Packaging the binary to a .jar
:
$ sbt packageBin
Will produce
target/scala-2.10/basic-scala_2.10-0.0.1.jar
(where
basic-scala
is the name of the project).
Why not Scala
Concepts
Covariance, Contravariance and Invariance
Reading:
In general, covariant type parameter can be used as immutable field type, method return type and also as method argument type if the method argument type has a lower bound. Because of those restrictions, covariance is most commonly used in producers (types that return something) and immutable types.
Adhoc polymorphism
In this article we discussed the motivation for introducing ad hoc polymorphism and implementing it using the Type Class Pattern in Scala. It allows us to build abstractions which are completely decoupled from the underlying data types on which they operate. Hence we can implement polymorphic functions which operate on types we have no control over, such as types defined in the standard library or some other third party library, without sacrificing the static type safety.
Concurrency (Akka etc.,)
StBreams
- Folding Stream with Scala(2011).
Libraries
- scalaz-stream
and related ..
Process[Task, A]
- Doobie – principled database access for scala
- Monix via Travis Brown on twitter for “exceptionally good documentation”
- Easy Parsing with Parser Combinators HN
- ConsBcript is a distribution mechanism for Scala apps using Github and Maven repositories as the infrastructure. You can use it to install and update apps similar to APT or Home Brew.
- Knobs Documentation - Home
Tools
- lihaoyi/Ammonite: Scala Scripting. Ammonite enables shell-like scripting in the Scala programming language.
- Conscript – is a tool for installing and updating Scala software programs.
- giter8 – is a command line tool to generate files and directories from templates published on github or any other git repository.
SBT
sbt the easy way – with example configurations.
sbt baby steps [Feb 2018]. SBT, scopes, proxy and so on
Ensime – Enhanced Scala
Interaction Mode for Emacs.
Talks
- Compositionality talk by Runorama.
Articles
- 16 months of FP (with scala examples).
- Scala’s Types of Types
- Generalized type constraints in Scala
- Scala Saturday: Functions for the Object-Oriented – Medium – a beginner overview of some scala features (eg: how apply works).
- Why? by Paul Snively.
- Transitioning to Scala – RedElastic (notes on “Scala levels” as espoused by Odersky.)
- Warts of the Scala Programming Language
- When the Scala compiler doesn’t help
Blogs
- Bcomposes | (Scala, Java, Python, R)
- Just another scala quant
- Vladimir Pavkin – Scala developer at Evolution Gaming
- alexn.org creator of Monix. see Asynchronous Programming and Scala
- Julien Richard-Foy – play, category-theory examples, dependency injection etc.,
- Timothy Perrett
- Blog Archive | Madusudanan – scala posts.
Libraries
- kantan.csv has good documentation/tutorials.
- Quill Quoted Domain Specific Language (QDSL) to express queries in Scala and execute them in a target language. The library’s core is designed to support multiple target languages, currently featuring specializations for Structured Query Language (SQL) and Cassandra Query Language (CQL).
REPL
Ammonite REPL is much more featureful than the default REPL and comes with a lot of ergonomic improvements and configurability that may be familiar to people coming from IDEs or other REPLs such as IPython or Zsh.
Links
- Cheatsheet - Idiomatic Scala: Your Options Do Not Match - Originate Developer Blog
- Scala Starter Kit
- Essential Scala
- Code examples for “Programming in Scala” book by Odersky
- Scala Exercises | The easy way to learn Scala
- λ Tony’s blog λ - scala.Option Cheat Sheet
- Scala jargon – Bonnie Eisenman
Scalajs
- From first principles: Why I bet on Scala.js
- vmunier/play-with-scalajs-example: Example application showing how you can integrate Play with Scala.js.
Scala Native
- Hands On Scala Native
- Stephen M. Blackburn and Kathryn S. McKinley. 2008. Immix: a mark-region garbage collector with space efficiency, fast collection, and mutator performance. In Proceedings of the 29th ACM SIGPLAN Conference on Programming Language Design and Implementation (PLDI ’08). ACM, New York, NY, USA, 22-32. [PDF].
- Fast startup and low latency - pick two [PDF] by Denys Shabalin and Lukas Kellenberger.
- Scala 0.3.0 announcement
Scala CLI
With scala-cli
, it is quite easy to package a scala
program into a standalone program:
scala-cli --power package --native-image Echo.scala -o echo -- --no-fallback
where Echo.scala
is:
object Echo {
def main(args: Array[String]): Unit =
println(args.mkString(" "))
}
$ ls -alrt echo
-rwxr-xr-x@ 1 pradeep staff 14120984 Aug 23 17:15 echo
$ du -sh echo
13M echo
Books
- Scala Design Patterns
- Overview of Apache Spark · Mastering Apache Spark 2 (Spark 2.2+) by jace klaskowski
- Introduction · Mastering Apache Kafka (0.11.0.1+) by jace klaskowski
- Introduction · Spark Structured Streaming (Apache Spark 2.2+) by jace klaskowski
Tutorials
- Learn Scala in Y Minutes
- The Neophyte’s Guide to Scala - Daniel Westheide
- bhoward/IndyScala Notebooks for the Scala Primer presentation to the Indy Scala meetup, September 2016.
- Mark Lewis - YouTube tutorials on Scala and programming. Dr. Lewis’s Homepage
- From Python to Scala: A Tutorial - Cristian Cardellino
Indyscala notes
Feb 6, 2017 – Resource management in Scala
Presenter – Ross A. Baker
- tut - Underscore
- atomic boolean in
- codensity == FManaged
- presentation code
May 1, 2017
- Brad Fritz – Introduction to Scala Type Classes
- Ross A. Baker – []