About
:octocat: GitHub: All of the example code: repo (link)
:page_facing_up: blog link: https://purrgramming.life/cs/programming/fp/ :star:
Package
Intro
Classes and objects are organized in packages.
To place a class or object inside a package, use a package clause at the top of your source file.
package progfun.examples
object Hello
...
This would place Hello in the package progfun.examples.
You can then refer to it by its fully qualified name, progfun.examples.Hello. For instance, to run the Hello program:
> scala progfun.examples.Hello

Example
package my
package pkg.hierarchy
object Data{
val course: String = "Functional Programming Principles"
}
What is the fully qualified name of ‘course’?
'my.pkg.hierarchy.Data.course'
‘Data’ contains ‘course’ and is defined in the ‘my.pkg.hierarchy’ package.
Import
Intro
You can import from either a package or an object.
Say we have a class Rational in package week3. You can use the class using its fully qualified name:
val r = week3.Rational(1, 2)
Alternatively, you can use an import:
import week3.Rational
val r = Rational(1, 2)
Forms of Imports
Imports come in several forms:
Named imports
import week3.Rational // imports just Rational
import week3.{Rational, Hello} // imports both Rational and Hello
Wildcard import
import week3._ // imports everything in package week3
Some entities are automatically imported into any Scala program.
These are:
- All members of package scala
- All members of package java.lang
- All members of the singleton object scala.Predef.
Here are the fully qualified names
$$
\begin{array}{ll}
\text { Int } & \text { scala. Int } \
\text { Boolean } & \text { scala. Boolean } \
\text { Object } & \text { java.lang. Object } \
\text { require } & \text { scala. Predef.require } \
\text { assert } & \text { scala. Predef. assert }
\end{array}
$$
Scala’s Class Hierarchy
Any:
- The base type of all types
- Methods:
==, equals, hashCode, toString.
AnyRef:
- The base type of all reference types;
- On the JVM, corresponds to
java.lang.Object.
AnyVal:
- The base type of Scala value types, including
Int,BooleanandUnit, and restricted user-defined value classes. Runtime representation may use primitives or boxing.
Nothing:
- It is a subtype of every other type.
- There is no value of type Nothing
- To signal abnormal termination
- As an element type of empty collections
Example
The type of
if true then 1 else false
can be widened to AnyVal in the Scala 2-style hierarchy illustrated here. Inference and printed result types differ across Scala versions; Scala 3 also has union types and Matchable. The transcript is an illustration, not a universal inferred-type guarantee.
val res0: AnyVal = 1
Takeaway
Packages organize names; imports change name visibility, not the underlying class hierarchy. Keep language-version assumptions explicit when comparing type-inference output.
References: Unified types; Value classes.