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.
In vollem Umfang?Ich bin mir nicht sicher, was genau du fragst oder was du nicht verstehst. – Bergi
Nun verstehe ich nicht, wie diese Funktion für eine Addition steht. Inwieweit definiert die Funktionsdefinition * eine Addition? –
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