13. In computer science,
a list or sequence is an
abstract data type that
implements a finite ordered
collection of values, where
the same value may occur more
than once.
- wikipedia
14. 1 2 3 4 5
1 2 3 4 5: : : : :
data List a = []
| a : (List a)
15. 1 2 3 4 5 [ ]: : : : :
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
16. 1 2 3 4 5: : : : :
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
[ ]
17. 1 2 3 4 5: : : : :
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
[ ]
18. 1 2 3 4 5: : : : :
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
[ ]
19. 1 2 3 4 5: : : : :
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
[ ]
20. 1 2 3 4 5: : : : :
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
[ ]
21. 1 2 3 4 5: : : : : e
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
22. 1 2 3 4 5: : : : e◁
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
23. 1 2 3 4 5: : : e◁◁
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
24. 1 2 3 4 5: : e◁◁◁
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
25. 1 2 3 4 5: e◁◁◁◁
foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
26. foldr :: (a → b → b) → b →
[a] → b
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
1 2 3 4 5 e◁◁◁◁◁
30. length :: [a] → Int
sum :: (Num a) ⇒ [a] → a
map :: (a → b) → [a] → [b]
filter :: (a → Bool) → [a] → [a]
inits :: [a] → [[a]]
concat :: [[a]] → [a]
maximum :: (Ord a) ⇒ [a] → a
e ?
(◁) ?
32. 1 2 3 4 5 [ ]: : : : :
foldr :: (a → b → b) → b → [a] → b
foldl :: (b → a → b) → b → [a] → b
foldl (▷) e [] = e
foldl (▷) e (x : xs) =
foldl (▷) (e ▷ x) xs
40. length :: [a] → Int
sum :: (Num a) ⇒ [a] → a
map :: (a → b) → [a] → [b]
filter :: (a → Bool) → [a] → [a]
concat :: [[a]] → [a]
maximum :: (Ord a) ⇒ [a] → a
e ?
(▷) ?
68. 65
1 2 3‡ ‡‡
e 1▷ 2▷ 3▷
folds (▷) e [] = e
folds (▷) e (ys ‡ y) =
(folds (▷) e ys) ▷ y
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
69. 66
1 2 3‡ ‡‡
e 1▷ 2▷ 3▷
folds (▷) e [] = e
folds (▷) e (ys ‡ y) =
(folds (▷) e ys) ▷ y
1 2 3: : :
foldl (▷) e [] = e
foldl (▷) e (x : xs) =
foldl (▷) (e ▷ x) xs
70. 67
foldl (▷) e [] = e
foldl (▷) e (x : xs) =
foldl (▷) (e ▷ x) xs
foldl (▷) e (ys ‡ y) =
(foldl (▷) e ys) ▷ y
foldr (◁) e [] = e
foldr (◁) e (x : xs) =
x ◁ (foldr (◁) e xs)
71. 68
h is foldl with (▷) e:
h [] = e
h (ys‡y) = (h ys) ▷ y
h ◦ (‡y) = (▷ y) ◦ h
h is foldr with (◁) e:
h [] = e
h (x:xs) = x ◁ (h xs)
h ◦ (x:) = (x ◁) ◦ h
point free
76. 73
3rd List Homo.Theorem
h is a list homomorphism
if h can be
foldr (◁) e and
foldl (▷) e
for some (◁), (▷) and e
77. 74
h ◦ (++ys)
={ foldr-fusion, since (++ys) = foldr (∶) ys }
foldr (◁) (h ys )
={ foldr-fusion (backwards) }
(⊕ h ys) ◦ foldr (◁) e
= (⊕ h ys) ◦ h
For the second foldr-fusion
h ys = e ⊕ h ys and
(x ◁ y) ⊕ h ys = x ◁ (y ⊕ h ys)
h ◦ (‡z)
={ foldr-fusion, since (‡z) = foldr (∶) [z]}
foldr (◁) (h [z])
={ foldr-fusion (backwards) }
(▷ z) ◦ foldr (◁) e
= (▷ z) ◦ h
For the second foldr-fusion
z ◁ e = e ▷ z and
(x ◁ y) ▷ z = x ◁ (y ▷ z)
h
= foldr
= foldl
h is
homo.
78. 75
h ys = e ⊕ h ys and
(x ◁ y) ⊕ h ys = x ◁ (y ⊕ h ys)
z ◁ e = e ▷ z and
(x ◁ y) ▷ z = x ◁ (y ▷ z)
h
= foldr
= foldl
h is
homo.
Requirement 1
Requirement 2
79. h = foldr = foldl
h is list homo.
requirement 1
requirement 2
(◁), (▷)
(⊕)
the way to go
80. 77
(x ◁ y) ▷ z
=
=
=
=
=
=
=
x ◁ (y ▷ z)
z z
z
z
z
(x ◁ y) ▷ z = x ◁ (y ▷ z)
81. 78
(x ◁ y) ▷ z
=
=
=
=
=
=
=
x ◁ (y ▷ z)
(1) (▷ z) => (⊕ (h ys))
z z
z
z
z
82. 79
(x ◁ y) ⊕ (h ys)
=
=
=
=
=
=
=
x ◁ (y ⊕ (h ys))
(1) (▷ z) => (⊕ (h ys))
z z
z
z
z
83. 80
(x ◁ y) ⊕ (h ys)
=
=
=
=
=
=
=
x ◁ (y ⊕ (h ys))
(1) (▷ z) => (⊕ (h ys))
(2) z => free variables
z z
z
z
z