Einer der grundlegenden Aspekte von Haskell ist, dass konzeptionell eine Funktion immer ein Argument nimmt. nehmen in der Tat zum Beispiel die Funktion (+)
:
(+) :: Int -> Int -> Int
(technisch ist es (+) :: Num a => a -> a -> a
, aber lassen Sie uns die Dinge einfach halten).
Nun können Sie argumentieren, dass (+)
zwei Argumente braucht, aber konzeptionell braucht es ein Argument. Tatsächlich: ist die Signatur in der Tat
(+) :: Int -> (Int -> Int)
So füttern Sie es eine ganze Zahl und jetzt gibt es eine Funktion, zum Beispiel:
(+) 5 :: Int -> Int
So haben Sie, indem sie ihm eine 5
geben, konstruiert eine Funktion, die einem gegebenen Operanden 5 hinzufügt (wiederum eine Funktion, die ein Argument benötigt).
Nun ist diese auf Ihre Frage angewendet wird, ist die Unterschrift von all'
in der Tat:
all' :: (a -> Bool) -> ([a] -> Bool)
Also, wenn Sie all'
mit einem Argument gelten, es eine Funktion gibt, die eine Liste bildet [a]
zu einem Bool
. Sprich für die Zwecke der Beweisführung, die wir p
-\_ -> True
gesetzt, dann kehren wir zurück:
foldr (&&) True . map (\_ -> True) :: [a] -> Bool
so in der Tat eine Funktion, die eine Liste nimmt [a]
und bildet sie auf einem Bool
. In einer nächsten Phase wenden Sie eine Liste an , die (zurück) -Funktion.
Mit anderen Worten, funktionale Programmierung kann als eine lange Kette der Spezialisierung einer Funktion weiter und weiter betrachtet werden, bis sie vollständig geerdet ist und ausgewertet werden kann.
Haskell bietet dies nur auf elegante Weise, so dass Sie nicht über Funktionen nachdenken müssen, die Funktionen erzeugen. Aber konzeptionell passiert dies die ganze Zeit.Gegeben Sie eine Funktion f :: a -> b -> c
implementieren möchten, können Sie dies tun, wie:
f x y = g (x+1) y
(mit g :: a -> b -> c
), aber Sie können auch entscheiden, einen Parameter aus zu verlassen, und definieren es als:
seit g (x+1)
wird eine Funktion zurückgeben, die mit der y
schließlich gelten kann.
Schreiben 'f x = g x. h x 'ist das gleiche wie das Schreiben von 'f x y = g x (h x y)', nach Definition des Kompositionsoperators '.'. Der erste Stil wird als "point-free style" (oder scherzhaft point-less style) bezeichnet. – chi
Ein Wort: Curry. – chepner