Kombinatoren
|
|
Komposition
|
(.) :: (b -> c) -> (a -> b) -> (a -> c)
g . f = \ x -> g (f x)
f4 = f3 . f2 . f1
|
| |
Komposition (vertauscht)
|
(>>>) :: (a -> b) -> (b -> c) -> (a -> c)
f >>> g = \ x -> g (f x)
f >>> g = g . f
f4 = f1 >>> f2 >>> f3
|
| |
flip
|
flip :: (a -> b -> c) -> (b -> a -> c)
flip f = \ x y -> f y x
(>>>) = flip (.)
|
| |
Kombinatoren
|
für Paare
|
(&&&)
|
(&&&) :: (a -> b) -> (a -> c) -> (a -> (b, c))
f &&& g = \ x -> (f x, g x)
f6 = (`div` 3) &&& (`mod` 3)
|
| |
|
Das Argument wird 2 mal verarbeitet
|
(***)
|
(***) :: (a -> c) -> (b -> d) -> ((a, b) -> (c, d))
f *** g = \ (x, y) -> (f x, g y)
f7 = (* 2) *** (+ 1)
f8 = f6 >>> f7
|
| |
uncurry
|
uncurry :: (a -> b -> c) -> ((a, b) -> c)
uncurry f = \ (x, y) -> f x y
f9 = uncurry (+)
f10 = f6 >>> f7 >>> f9
|
| |
|
2 Argumente werden verarbeitet
|
|
Funktionalität kann auf flexible Art sehr kommpakt zusammengesetzt werden.
|
|
Erweiterbarkeit: Kombination von Funktionen mit IO?
|
|
Monaden: Code muss vollständig umgeschrieben werde (do-Notation, >>=)
|
|
Arrows: Code muss nicht umgeschrieben werden
|
Beispiele |
Haskell-Quelle: ex.hs
|