MI-PSL-6 Flashcards
- What is it a literal pattern? Write a simple example.
Pattern je konstrukt, který může být porovnáván vůči hodnotě.
Výraz je porovnáván vůči literálu (konstantě) a vyhoví, pokud equals.
def spell(x: Int) = x match { case 0 => "zero" // 0 is a literal pattern hear case 1 => "one" case 2 => "two" }
- What happens if no matching pattern is found.
MatchError exception je vyhozena
- What is it a placeholder pattern and where it is usually used?
Placeholder pattern je něco jako default u switche v javě. Je to wildcard, když nic jiného nematchuje. Zapisuje se podtržítkem. Volitelně je možné uvést typ, který musí hodnota splňovat.
x match { // ... case _ : Int => "an integer" case _ => "something else" }
- What is it a variable pattern?
Variable pattern matchuje s každým výrazem a jeho hodnotu přiřadí do dané proměnné. Název proměnné musí začínat malým písmenem. Volitelně je možné uvést typ, který musí hodnota splňovat (hodnota null neprojde).
x match {
case i : Int => “celočíselná hodnota: “ + i
case n => “hodnota je: “ + n
}
- What is it a constructor pattern?
Constructor pattern matchuje s case classes, které mají stejné hodnoty v konstruktoru.
x match { case Rect(1, 2) => "obdélník 1×2" case Rect(1, h) => "obdélník o šířce 1 a výšce " + h }
- What is it a extractor pattern?
Má stejnou syntaxi jako constructor pattern, na daném objektu je zavolána metoda unapply, která musí vracet buď typ Boolean (hodnota matchuje při vrácení true), nebo Option (hodnota matchuje při vrácení Some).
object Positive { def unapply(x : Int) : Boolean = x > 0 } object PositiveOrNegative { def unapply(x : Int) : Option[String] = if(x > 0) Some("positive") else if(x "x is positive" case PositiveOrNegative(result) => "x is " + result // "x is positive" nebo "x is negative" }
- What is it a tuple pattern?
Tupple pattern se matchuje vůči Tuplen třídě. Jednoduchý příklad:
def reverse(t : (Int, Int)) = t match { case (x, y) => (y, x) } reverse(1,2)
- Do write an example of pattern guard.
Pattern guard obchází nutnost mít různě pojmenované proměnné např v konstruktor patternu.
def simplify(e: Expr) = e match { case BinOp("+", x, y) if x == y => BinOp("*", x, Number(2)) case _ => e }
- What is it an infix operation pattern?
def printTail(l : AnyRef) { l match { case head :: tail => println("tail:" + tail) case _ => println("not list") } }
- What is a difference between variable and StableId pattern?
U stableId patternu se porovnává matchovaná hodnota s hodnotou zadané proměnné. Tato proměnná musí začínat velkým písmenem, jinak musí být uzavřená zpětnými apostrofy:
val One = 1 val one = 1 x match { case One => "jednička" // případně case `one` => "jednička" } Naproti tomu u variable patternu vyhoví jakákoliv hodnota (volitelně omezená typem proměnné) a ta se přiřadí do zadané proměnné:
x match {
case num => “hodnota je “ + num
}