Gruppen 5 und 7
Samuel Teuber
propa@teuber.dev
https://teuber.dev/propa
Was ist das Problem dieses Codestücks?
numAcc (x:xs) n
| (x == 1) = n
| otherwise = numAcc xs n+1
Call by Value: Was ist ein Wert?
-> Jede Abstraktion ist ein Wert (unabh. ob in Normalform oder nicht)
Typ (Show ([Char] -> a)) => ([Char] -> a) -> ([Char] -> a)
:
instance Show (a -> b) where
show x = "whatever this shows..."
f a = a
show f
instance Show ([Char] -> b) where
show x = "bla"
Normalreihenfolge: Was hat Vorrang? Linkestes oder Äußerstes?
Macht keinen Unterschied
c0 c1 (c2 c3 c4) c5
(c0 c1 c2) (c3 c4 c5)
c0 c1 (c2 c3 c4) (c5 c6)
c0 c1 (c2 c3 c4) c5 c6
c0 (c1 (c2 c3 c4)) c5 c6
(λy . c0 c1 c2) (c3 c4 c5)
(λy . c0 (λz. c1 c2 )) (c3 c4 c5)
c0 c1 (c2 c3 c4) c5
((c0 c1) ((c2 c3) c4)) c5
(c0 c1 c2) (c3 c4 c5)
((c0 c1) c2) ((c3 c4) c5)
c0 c1 (c2 c3 c4) (c5 c6)
((c0 c1) ((c2 c3) c4)) (c5 c6)
c0 c1 (c2 c3 c4 ) c5 c6
(((c0 c1) ((c2 c3) c4)) c5) c6
c0 (c1 (c2 c3 c4)) c5 c6
(((c0 (c1 ((c2 c3) c4))) c5) c6)
(λy . c0 c1 c2) (c3 c4 c5)
(λy . ((c0 c1) c2)) ((c3 c4) c5)
(λy . c0 (λz. c1 c2 )) (c3 c4 c5)
(λy . (c0 (λz. (c1 c2)))) ((c3 c4) c5)
Welcher Term repräsentiert den gleichen Term wie λy . y c0
?
(λy . y ) c0
λy . (y c0)
Substitution:
x=λy.y
in den Term (x) c0
x=(λy.y)
in den Term x c0
x=λy.y
in den Term x c0
(λa.a) (λb.b) ((λc.c) ((λd.d) (λe.e) (λf .f ))) (λg .g ) ((λh.h) (λi.i)).
type Church t = (t -> t) -> t -> t
int2church :: Integer -> Church t
church2int :: Church Integer -> Integer
type Church t = (t->t) -> t -> t
int2church 0 = \s z -> z
int2church n = \s z -> int2church (n-1) s (s z)
church2int n = n (+1) 0
church2int (int2church 10)
t1 = (λt. λf. f) ((λy. (λx. x x) (λx. x x)) ((λx. x) (λx. x))) (λt. λf. f)
t2 = λy. (λz. (λx. x) (λx. x) z) y
Fragen?
Frege'scher Schlussstrich
Bekannt aus GBI
fun6 :: (Enum a, Enum b, Enum c) => a -> b -> c
fun6 x y = succ (toEnum (last [fromEnum x..fromEnum y]))
Polymorpher Typ mit Typvariablen a, b, c
Auch anwendbar auf Lambda-Kalkül!
bool, int, ...
$\Gamma \vdash t : \tau$ im Typkontext $\Gamma$ hat Term $t$ den Typ $\tau$
$\Gamma$ ordnet freien Variablen x ihre Typen $\Gamma\left(x\right)$ zu
pair = $\lambda a.\lambda b.\lambda f. f a b$
Typ?
Typvariablen, Typvariablen, Typvariablen
$\forall \alpha_1. \forall \alpha_2. \dots \forall \alpha_n. \tau$
Steht für unendl. viele Typen mit initialisierten Typvariablen $\alpha_1 \dots \alpha_n$
$\forall \alpha. \alpha \rightarrow \alpha \succeq$ int -> int
$\forall \alpha. \alpha \rightarrow \alpha \succeq$ bool -> bool
Problem: $\lambda f.\ f\ (f\ \texttt{true})$ : ($\alpha$ -> int) -> int