MI-PSL-7 Flashcards

1
Q

Describe the Scala types taxonomy.

A
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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Outline (simplified) Scala class hierarchy.

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

What is it the path?

A

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)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

What is it the stable identifier and where is required?

A

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"
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

What requirements must fulfill the parameterized type?

A

(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]

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

What is the format of the tuple type and for what is it alias?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

What is the format of the compound type?

A

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…}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

What is it ducktyping?

A

„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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

What is the form of the type declaration?

A

Format:

TypeDcl = id [TypeParamClause] [vetsi Type] [mensi Type]

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

What is the form of the type definition?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

What constructs has type parameters?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

What is the relation of parameterized types T[S] and T[R] if S mensi nez R

A

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]

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Where a covariant type parameter can be used?

A
typ hodnoty (val)
návratový typ funkce

immutable kolekce

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Where a contravariant type parameter can be used?

A

parametr funkce

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Where an invariant type parameter can be used?

A

všude jinde - proměnná, parametr funkce, návratový typ funkce

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

What is it the singleton type? What values belong to the singleton type?

A

SimpleType = Path . type

je typ dvou hodnot : null a hodnota urcena cestou Path

17
Q

What is it the type projection? What values belong to the type projection?

A

SimpleType = SimpleType # typeid
typ vsech instanci typu clena typeid z SimpleType
type projection is used to access type members. například pro vnořené třídy: Outer#Inner

18
Q

What is it the path-dependent type? Write an example.

A

Jedná se o typy (třídy), jejichž identita závisí na cestě, kterou se k nim dostaneme. Pokud definujeme třídu uvnitř jiné třídy, dostaneme se k vnitřní třídě pouze pomocí instance vnější třídy a zároveň přístup k vnitřní třídě pomocí jedné instance vnější třídy reprezentuje jiný typ než přístup pomocí jiné instance vnější třídy. Vnitřní třídu můžeme označit pomocí projekce vnější#vnitřní:

class Outer {
    class Inner {}
}
val o1 = new Outer
val i1 = new o1.Inner
val o2 = new Outer
val x: o1.Inner = i1  // OK
val x: o2.Inner = i1  // error: type mismatch
val x: Outer#Inner = i1  // OK
19
Q

Write an example of the enumeration.

A

Enumerace nejsou ve Scale součástí syntaxe, ale můžeme využít vestavěnou třídu scala.Enumeration:

object RgbColor extends Enumeration {
    val Red = Value
    val Green = Value
    val Blue = Value
}
nebo zkráceně:

object RgbColor extends Enumeration {
val Red, Green, Blue = Value
}