
### Rachunek lambda i jego reprezentacja w Javie

```reprezentacja matematyczna
\pocztek{rwnanie}
\(f = \lambda x. E\)
\koniec{rwnanie}
```

```java
Function<Integer, Integer> quadratic =
    warto -> warto * warto;
```

### Przykady wyrae

```java
x * x
2 * Math.PI * radius
value == null ? true : false
```

### Przykady instrukcji

```java
// Przypisanie zmiennej
int totalTreasure = 0;

// Wywoanie findTreasure jest wyraeniem,
// ale przypisanie zmiennej jest instrukcj
int newTreasuresFound = findTreasure(6);

// Uycie wyraenia do ponownego przypisania
// zmiennej za pomoc instrukcji
totalTreasure = totalTreasure + newTreasuresFound;

// if-else jest instrukcj wartociujc swj warunek, ktry jest wyraeniem
if (totalTreasure > 10) {
    // Instrukcja niezwracajca adnego rodzaju rezultatu
    System.out.println("Masz mnstwo skarbw!");
} else {
    // Instrukcja niezwracajca adnego rodzaju rezultatu
    System.out.println("Powiniene poszuka kolejnych skarbw!");
}
```


## Koncepcje programowania funkcyjnego

### Funkcje czyste i tranaprarencyjno referencyjna

#### Przykad funkcji czystej

```java
public String toLowercase(String str) {
    return str;
}
```

#### Przykad funkcji nieczystej

```java
public String buildGreeting(String name) {
    var now = LocalTime.now();
    if (now.getHour() < 12) {
        return "Dzie dobry, " + name;
    } else {
        return "Witaj, " + name;
    }
}
```

#### Transparencyjno referencyjna

```reprezentacja matematyczna
\pocztek{ranie}
\pocztek{wyrwnanie}
\tekst{Funkcja abstrakcyjna} \\
f(x) &= x * x
\\
\\
\tekst{Zastpienie ewaluowanego wyraenia} \\
    result &= f(5) + f(5) \\
    &= 25 + f(5) \\
    &= f(5) + f(5) \\
    &= 25 + 25
\koniec{wyrwanie}
\koniec{rwnanie}
```


### Rozwijanie funkcji

#### Rozwijanie funkcji, ktra przyjmuje trzy argumenty

```reprezentacja matematyczna
\pocztek{rwnanie}
\pocztek{wyrwanie}
\tekst{Funkcja pocztkowa:}\\
x &= f(a,b,c)
\\[24pt]
\tekst{Funkcje rozwinite:} \\
h &= g(a)
\\
i &= h(b)
\\
x &= i(c)
\\[24pt]
\tekst{Sekwencja funkcji rozwinitych:}
\\
x &= g(a)(b)(c)
\\
\koniec{wyrwanie}
\koniec{rwnanie}
```

##### definicje funkcji w Haskellu

```haskell
-- Funkcja add przyjmuje Integer, zwracajcy funkcj,
-- ktra przyjmuje kolejny Integer i zwraca Integer
add :: Integer -> Integer -> Integer
add x y =  x + y
```


### Czciowe zastosowanie funkcji

```haskell
add :: Integer -> Integer -> Integer
add x y =  x + y

-- Pzy zaoeniu, e tylko jeden z dwch argumentw czciowo stosuje funkcj,
-- zwracamy now funkcj, ktra przyjmuje pojedynczy argument
add3 = add 3

-- Wywoanie add3 jest rwnowane z "add 3 5"
add3 5
```
