initial commit, some work done
This commit is contained in:
commit
89c3877933
4 changed files with 95 additions and 0 deletions
BIN
intro.agdai
Normal file
BIN
intro.agdai
Normal file
Binary file not shown.
82
intro.lagda.md
Normal file
82
intro.lagda.md
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
# Funktionale Programmierung in Agda
|
||||||
|
In dieser Datei werden wir einen kleinen Blick in funktionale Programmierung mit Agda wagen.
|
||||||
|
Agda ist eine funktionale Programmiersprache wie Haskell,
|
||||||
|
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.
|
||||||
|
|
||||||
|
<!--
|
||||||
|
```agda
|
||||||
|
module intro where
|
||||||
|
Type = Set
|
||||||
|
private
|
||||||
|
variable
|
||||||
|
A B C : Type
|
||||||
|
open import Agda.Primitive
|
||||||
|
```
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Warmup
|
||||||
|
|
||||||
|
Ziel dieses Kapitels ist es etwas Familiarität mit Agda zu gewinnen.
|
||||||
|
Wir werden vor allem bekanntes Wissen aus ThProg anwenden und hier implementieren.
|
||||||
|
|
||||||
|
### Recall: Lambda-Kalkül
|
||||||
|
Der (ungetypte) Lambda-Kalkül ist die Grundlage jeder funktionalen Programmiersprache.
|
||||||
|
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).
|
||||||
|
|
||||||
|
Applikation in Agda ist klar, einfach das hintereinanderschreiben von Termen, Abstraktion wird geschrieben als 'λ x → t'.
|
||||||
|
|
||||||
|
|
||||||
|
### Aufgabe 1
|
||||||
|
Definiere die Identitätsfunktion
|
||||||
|
|
||||||
|
```agda
|
||||||
|
id : ∀ {A : Type} → A → A
|
||||||
|
-- Erklärung des Typs:
|
||||||
|
-- Der Allquantor funktioniert wie in System F, nur hat der Typ über den wir quantifizieren ebenfalls einen Typ! (Den Typ 'Type' der Typen)
|
||||||
|
id = _
|
||||||
|
```
|
||||||
|
|
||||||
|
### Aufgabe 2
|
||||||
|
Definiere die Komposition zweier Funktionen
|
||||||
|
```agda
|
||||||
|
_∘_ : ∀ {A B C : Type} → (g : B → C) → (f : A → B) → A → C
|
||||||
|
_∘_ = _
|
||||||
|
```
|
||||||
|
|
||||||
|
## Induktive Datentypen
|
||||||
|
Agda implementiert induktive Datentypen genau so wie wir sie in ThProg kennengelernt haben, d.h. wir definieren einen Datentypen, indem wir seine Konstruktoren angeben. Ein paar Beispiele:
|
||||||
|
|
||||||
|
### Natürliche Zahlen
|
||||||
|
```agda
|
||||||
|
data ℕ : Type where
|
||||||
|
zero : ℕ
|
||||||
|
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!
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Aufgabe 3
|
||||||
|
Definiere die Additionsfunktion auf natürlichen Zahlen
|
||||||
|
```agda
|
||||||
|
add : ℕ → ℕ → ℕ
|
||||||
|
add n m = _
|
||||||
|
```
|
||||||
|
|
||||||
|
Definiere die Prädezessorfunktion
|
||||||
|
#### Aufgabe 4
|
||||||
|
```agda
|
||||||
|
pred : ℕ → ℕ
|
||||||
|
pred n = _
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Aufgabe 4
|
||||||
|
Definiere eine Subtraktionsfunktion
|
||||||
|
```agda
|
||||||
|
sub : ℕ → ℕ → ℕ
|
||||||
|
sub n m = _
|
||||||
|
```
|
BIN
systemF.agdai
Normal file
BIN
systemF.agdai
Normal file
Binary file not shown.
13
systemF.lagda.md
Normal file
13
systemF.lagda.md
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
## Recall: System F
|
||||||
|
```agda
|
||||||
|
ℕ : Set₁
|
||||||
|
ℕ = ∀ {A} → (A → A) → A → A
|
||||||
|
zero : ℕ
|
||||||
|
zero = λ f x → x
|
||||||
|
suc : ℕ → ℕ
|
||||||
|
suc = λ n f x → f (n f x)
|
||||||
|
fold : ∀ {A} → (A → A) → A → ℕ → A
|
||||||
|
fold = λ f x n → n f x
|
||||||
|
-- add : ℕ → ℕ → ℕ
|
||||||
|
-- add = λ n → fold suc n
|
||||||
|
```
|
Loading…
Reference in a new issue