0

Ich studiere derzeit funktionale Programmierung und es ist das wichtigste Merkmal: Höhere Ordnung Funktionen.Verständnis Currying und HOFs

Es ist nicht so kristallklar, wie ich derzeit möchte und deshalb würde ich gerne perfekt verstehen, wie HOFs arbeiten.

In Anbetracht dieser Funktion

{- Curried addition. -} 
plusc :: Num a => a -> (a -> a) 
plusc = (+) 

Inwieweit können wir sagen, dass diese Funktion currying verwendet und ist ein HOF?

EDIT: Im Grunde genommen, ich verstehe nicht, wie die Definition der Funktion für einen Zusatz steht (Parameter, Assoziativität, usw.)

+0

In vollem Umfang?Ich bin mir nicht sicher, was genau du fragst oder was du nicht verstehst. – Bergi

+0

Nun verstehe ich nicht, wie diese Funktion für eine Addition steht. Inwieweit definiert die Funktionsdefinition * eine Addition? –

+1

Der Zusatz wird durch den Operator '+' definiert, den 'plusc' verwendet. Vielleicht hilft es, 'plusc xy = x + y' oder' plusc = \ x -> \ y -> x + y' (die nur syntaktische Zucker für einander sind, wie 'x + y' =' (+) xy') – Bergi

Antwort

0

würde ich nicht persönlich Anruf plusc ein HOF, weil seine Argumente aren funktioniert nicht. Ein Weg, um eine offensichtliche HOF zu erkennen ist für eine Pars in der Signatur zu sehen, dass sind nicht auf der linken Seite:

{- equivalent signature -} 
plusc :: Num a => a -> a -> a 

Wenn wir optional Pars zu entfernen, ist es offensichtlich, dass die Funktion nicht ein HOF das braucht Funktionen, aber es ist curried.

Hinweis: Da jede curried Funktion kann Rückkehr eine Funktion, aber wir könnten sagen, dass, nachdem sie teilweise die Anwendung, hat es eine Funktion gibt, und als solcher arbeitet auf Funktionen - so ist es ein HOF. Ich denke nicht, dass dies eine besonders hilfreiche Möglichkeit ist, das Konzept zu beschreiben/zu lernen, aber ich nehme an, dass die Definition sowohl Parameter als auch Ergebnisse umfassen würde.

Eine uncurried Version würde einfach Gruppe ihre Argumente:

plusUnc :: Num a => (a, a) -> a 

Jetzt ein HOF könnte nehmen eine solche Funktion und schalten Sie ihn in eine andere ein:

imu :: Num a => (a -> a -> a) -> (a -> a -> a) 
imu f = \a b -> f a b 

Hinweis : Der Lambda-Impl könnte offensichtlich vereinfacht werden, ich habe ihn nur zur Illustration geschrieben.

Beachten Sie, dass f ist die "untere" Reihenfolge Funktion, die in imu übergeben wird. Um es zu nutzen:

imuPlus = imu plusc -- a function is being passed 

imuPlus 1 2   -- == 3 

Hinweis: Da wir beide Konzepte abmischen (und Sie werden gefragt für beide), wird imu auch curried. Eine uncurried Version könnte wie folgt aussehen:

imuUnc :: ((a -> a -> a), (a, a)) -> a

Jetzt ist es ein HOF (es eine Funktion in den Parametern hat), aber es ist nicht eine Funktion zurückgeben, die oben aus den Beispielen unterscheiden. Es ist nur viel einfacher zu verwenden, wenn es curried ist, vor allem wegen der teilweise Anwendung.

+0

Higher-order kann auch bedeuten, dass eine Funktion eine andere Funktion zurückgibt, was ziemlich Standard für Haskells Curry-Funktionen ist, aber – Bergi

+0

@Bergi oh gut, okay, * returning * eine Funktion könnte vielleicht auch eine Funktion zu einem HOF machen; Ich schaue es sehr selten so an, aber ich werde es bearbeiten. –

+0

@Bergi In Haskell denke ich auch selten an Funktionen, die Funktionen wie HOFs zurückgeben, aber ich denke, das könnte noch passen. Ich wäre wahrscheinlich eher geneigt, 'plusc' einen HOF zu nennen, weil die Bedingung 'Num a =>' implizit ein Wörterbuch mit einem Bündel von Funktionen an' plusc 'weitergibt. Dennoch glaube ich, dass die "HOF" -Terminologie heutzutage nicht mehr so ​​nützlich ist - HOFs sind zu gewöhnlich geworden, um sie zu bemerken. – chi