minor
This commit is contained in:
parent
01ebc0a315
commit
fe0f8a6744
3 changed files with 40 additions and 17 deletions
1
Makefile
1
Makefile
|
@ -27,4 +27,5 @@ push: all
|
||||||
mv -T agda-intro public
|
mv -T agda-intro public
|
||||||
|
|
||||||
Everything.agda:
|
Everything.agda:
|
||||||
|
rm -f src/Everything.agda
|
||||||
git ls-files | egrep '^src/[^\.]*.l?agda(\.md)?' | sed -e 's|^src/[/]*|import |' -e 's|/|.|g' -e 's/.agda//' -e '/import Everything/d' -e 's/..md//' | LC_COLLATE='C' sort >> src/Everything.agda
|
git ls-files | egrep '^src/[^\.]*.l?agda(\.md)?' | sed -e 's|^src/[/]*|import |' -e 's|/|.|g' -e 's/.agda//' -e '/import Everything/d' -e 's/..md//' | LC_COLLATE='C' sort >> src/Everything.agda
|
||||||
|
|
|
@ -1,5 +1 @@
|
||||||
import Intro
|
import Intro
|
||||||
import Intro
|
|
||||||
import Intro
|
|
||||||
import Intro
|
|
||||||
import Intro
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Funktionale Programmierung in Agda
|
# Funktionale Programmierung in Agda
|
||||||
In dieser Datei werden wir einen kleinen Blick in funktionale Programmierung mit Agda wagen.
|
In dieser Datei werden wir einen kleinen Blick in funktionale Programmierung mit Agda wagen.
|
||||||
Agda ist eine funktionale Programmiersprache wie Haskell,
|
Agda ist eine funktionale Programmiersprache deren Syntax der von Haskell sehr ähnlich ist,
|
||||||
jedoch besitzt Agda ein deutlich ausdrucksstärkeres Typsystem durch sogenannte *dependent types*.
|
jedoch besitzt Agda ein deutlich ausdrucksstärkeres Typsystem durch sogenannte *dependent types*.
|
||||||
Das sind Typen welche von Termen der Programmiersprache abhängen können, aber dazu in späteren Kapiteln mehr.
|
Das sind Typen welche von Termen der Programmiersprache abhängen können, aber dazu in späteren Kapiteln mehr.
|
||||||
|
|
||||||
|
@ -24,11 +24,12 @@ Wir werden vor allem bekanntes Wissen aus ThProg anwenden und hier implementiere
|
||||||
### Recall: Lambda-Kalkül
|
### Recall: Lambda-Kalkül
|
||||||
Der (ungetypte) Lambda-Kalkül ist die Grundlage jeder funktionalen Programmiersprache.
|
Der (ungetypte) Lambda-Kalkül ist die Grundlage jeder funktionalen Programmiersprache.
|
||||||
Ein Term des Lambda-Kalküls ist entweder
|
Ein Term des Lambda-Kalküls ist entweder
|
||||||
- Eine Variable x ∈ V
|
|
||||||
- Eine Applikation zweier Lambda Terme t₁t₂
|
|
||||||
- Eine Lambda-Abstraktion λx.t, wobei x ∈ V und t Term.
|
|
||||||
|
|
||||||
Diese drei Komponenten finden wir deshalb in jeder funktionalen Programmiersprache, wobei in der Regel Syntaxzucker für Lambda-Abstraktionen angeboten wird (die übliche Funktionsnotation).
|
- Eine Variable *x ∈ V*
|
||||||
|
- Eine Applikation zweier Lambda Terme *t₁ t₂*
|
||||||
|
- Eine Lambda-Abstraktion *λx.t*, wobei *x ∈ V* und *t* Term.
|
||||||
|
|
||||||
|
Diese drei Komponenten finden wir deshalb in jeder funktionalen Programmiersprache, wobei in der Regel Syntaxzucker für Lambda-Abstraktionen angeboten wird. D.h. *f x = b* ist Syntaxzucker für *λ x → b*.
|
||||||
|
|
||||||
Applikation in Agda ist klar, einfach das hintereinanderschreiben von Termen, Abstraktion wird geschrieben als 'λ x → t'.
|
Applikation in Agda ist klar, einfach das hintereinanderschreiben von Termen, Abstraktion wird geschrieben als 'λ x → t'.
|
||||||
|
|
||||||
|
@ -57,9 +58,6 @@ Agda implementiert induktive Datentypen genau so wie wir sie in ThProg kennengel
|
||||||
data 𝔹 : Type where
|
data 𝔹 : Type where
|
||||||
tt : 𝔹
|
tt : 𝔹
|
||||||
ff : 𝔹
|
ff : 𝔹
|
||||||
{-# BUILTIN BOOL 𝔹 #-}
|
|
||||||
{-# BUILTIN TRUE tt #-}
|
|
||||||
{-# BUILTIN FALSE ff #-}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Aufgabe 3
|
#### Aufgabe 3
|
||||||
|
@ -95,21 +93,27 @@ foldb t s b = _
|
||||||
data ℕ : Type where
|
data ℕ : Type where
|
||||||
zero : ℕ
|
zero : ℕ
|
||||||
succ : ℕ → ℕ
|
succ : ℕ → ℕ
|
||||||
{-# BUILTIN NATURAL ℕ #-} -- Hierdurch können wir einfach '0, 1, 2, ...' statt 'zero, succ zero, succ (succ zero), ...' schreiben, wir bekommen aber **keine** Funktionen wie z.B. Addition geschenkt!
|
{-# BUILTIN NATURAL ℕ #-} -- Hierdurch können wir einfach '0, 1, 2, ...' statt 'zero, succ zero, succ (succ zero), ...' schreiben. Wir bekommen aber **keine** Funktionen wie z.B. Addition geschenkt!
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Aufgabe 7
|
#### Aufgabe 7
|
||||||
Definiere die Additionsfunktion auf natürlichen Zahlen.
|
Definiere Funktionen zur Addition und Subtraktion natürlicher Zahlen.
|
||||||
```agda
|
```agda
|
||||||
add : ℕ → ℕ → ℕ
|
add : ℕ → ℕ → ℕ
|
||||||
add n m = _
|
add n m = _
|
||||||
|
|
||||||
|
sub : ℕ → ℕ → ℕ
|
||||||
|
sub n m = _
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Aufgabe 8
|
#### Aufgabe 8
|
||||||
Definiere eine Subtraktionsfunktion.
|
Definiere Funktionen `odd` und `even`, welche testen ob eine natürliche Zahl gerade oder ungerade ist.
|
||||||
```agda
|
```agda
|
||||||
sub : ℕ → ℕ → ℕ
|
odd : ℕ → 𝔹
|
||||||
sub n m = _
|
odd n = _
|
||||||
|
|
||||||
|
even : ℕ → 𝔹
|
||||||
|
even n = _
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Aufgabe 9
|
#### Aufgabe 9
|
||||||
|
@ -119,6 +123,28 @@ foldn : ∀ {C : Type} → C → (C → C) → ℕ → C
|
||||||
foldn c h n = _
|
foldn c h n = _
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Optionale Aufgaben
|
||||||
|
|
||||||
|
##### Optionale Aufgabe 1
|
||||||
|
Definiere `add'` und `sub'` mittels `foldn` (*ohne* pattern matching).
|
||||||
|
```agda
|
||||||
|
add' : ℕ → ℕ → ℕ
|
||||||
|
add' = _
|
||||||
|
|
||||||
|
sub' : ℕ → ℕ → ℕ
|
||||||
|
sub' = _
|
||||||
|
```
|
||||||
|
|
||||||
|
##### Optionale Aufgabe 2
|
||||||
|
Definiere `odd'` und `even'` mittels `foldn` (*ohne* pattern matching).
|
||||||
|
```agda
|
||||||
|
odd' : ℕ → 𝔹
|
||||||
|
odd' = _
|
||||||
|
|
||||||
|
even' : ℕ → 𝔹
|
||||||
|
even' = _
|
||||||
|
```
|
||||||
|
|
||||||
### Listen
|
### Listen
|
||||||
|
|
||||||
```agda
|
```agda
|
||||||
|
|
Loading…
Reference in a new issue