MI-PSL-7 Flashcards
Describe the Scala types taxonomy.
typy prvního řádu hodnotové konkrétní – vyjadřuje jednak jednoduché typy (třídy a traity), jednak složené typy, např.: Point with Moveable { // refinement def moveToOrigin } kde refinement ještě slouží k dodatečným deklaracím
abstraktní – může se jednat o typové parametry (jako proměnná typu List[T]) nebo vlastní deklarace typů:
type T
Outline (simplified) Scala class hierarchy.
scala. Any – slouží jako vrchol hierarchie tříd, je to abstraktní třída, definuje základní metody (equals – abstraktní, ==, !=, hashCode, toString, isInstanceOf, asInstanceOf)
scala. AnyVal – zastupuje hodnotové typy
scala. AnyRef – zastupuje referenční typy (dá se přirovnat k java.lang.Object)
scala. Null – je podtřídou všech referenčních typů, definuje hodnotu null, více viz otázka „How is defined value null?“
scala. Nothing – je podtřídou všech ostatních typů (včetně scala.Null), je úplně naspodu hierarchie tříd; používá se např. jako návratová hodnota výrazu throw
What is it the path?
Cesta je jednoznačné označení typu nebo hodnoty, např. scala.Any, this, C.super, this.C, super.v apod.
- obsahuje pouze identifikatory stabilnich clenu (balicky, objekty a hodnoty - ne vars)
What is it the stable identifier and where is required?
Jedná se o cestu (viz otázka výše), která končí identifikátorem, tedy nemá na konci this. Využívá se v:
import klauzuli pattern matchingu jako stable identifier pattern (matchování podle předdefinované hodnoty): val One = 1 val one = 1 x match { case One => "jednička" // případně case `one` => "jednička" } contructor a extractor patternu: x match { case Rect(1, 2) => "obdélník 1×2" }
What requirements must fulfill the parameterized type?
(Parametrizovany typ obsahuje type designator a jeho argumenty.)
Typove argumenty se museji vzdy vlozit do typoveho konstruktoru (napr. nemuzeme napsat List -> musi to byt List{Type]
What is the format of the tuple type and for what is it alias?
Typ tuple se zapisuje jako (T1, …, Tn) a jedná se o syntaktickou zkratku pro typ scala.Tuplen[T1, …, Tn], což je case třída definující metody _1 až _n pro přístup k jednotlivým hodnotám.
What is the format of the compound type?
Format:
AnnotType {with AnnotType} [Refinement] | Refinement
Refinement = [nl] {RefineStat {semi RefineStat}}
RefineStat = Dcl | type TypeDef
Složený typ se zapisuje např. takto:
Point with Moveable { // refinement def moveToOrigin } kde refinement ještě slouží k dodatečným deklaracím. Složený typ může být zapsán i samotným refinementem, pak je to stejné, jako AnyRef {…refinement…}
What is it ducktyping?
„When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.“
Můžeme požadovaný typ označit pouze pomocí refinementu (viz otázka výše), tedy nadeklarovat pouze to, co má umět. Např.:
object Main {
def letQuack(duckLike : { def quack() })
// compound type given only by refinement
duckLike.quack()
}
}
a je nám jedno, co to bude ve skutečnosti za typ, hlavně že umí kvákat.
What is the form of the type declaration?
Format:
TypeDcl = id [TypeParamClause] [vetsi Type] [mensi Type]
What is the form of the type definition?
Format:
Def = type {nl} TypeDef |
TypeDef = id [TypeParamClause] = Type
Definice může být jednak pojmenování typu jiným označením, např.:
type MapStringInt = Map[String, Int]
nebo konstruktor typu, např.:
type InvMap[V, K] = Map[K, V]
V případě definice typu, který byl nadeklarovaný dříve (např. v nadtřídě), musíme dbát na omezení daná horní a spodní mezí, tedy musí platit LowerBound
What constructs has type parameters?
Typové parametry se můžou objevit:
v definici typu:
type ListOfRef[T]: List[T]
v definici class a traitu: abstract class List[+A]
v definici funkce
What is the relation of parameterized types T[S] and T[R] if S mensi nez R
Záleží na varianci pozice. Pokud máme definici třídy s parametrem:
class T[A] {…} nebo typu s parametrem:
type T[A] = …
Pak platí:
pokud je typ A definován jako kovariantní, tedy T[+A], pak T[R] je mensi nez T[S]
pokud je A definovan jako kontravarianti, tedy T[-A], pak T[R] je mensi nez T[S]
Where a covariant type parameter can be used?
typ hodnoty (val) návratový typ funkce
immutable kolekce
Where a contravariant type parameter can be used?
parametr funkce
Where an invariant type parameter can be used?
všude jinde - proměnná, parametr funkce, návratový typ funkce