Je ne voudrais pas personnellement appel plusc
une HOF, parce que ses arguments aren 't fonctions. Une façon de repérer une HOF évidente est de chercher un parens dans la signature que ne sont pas au côté gauche:
{- equivalent signature -}
plusc :: Num a => a -> a -> a
Lorsque nous enlevons parens en option, il est évident que la fonction n'est pas une HOF cela prend des fonctions, mais c'est curry.
Note: Étant donné que chaque fonction peut cari retour une fonction, cependant, pourrait-on dire qu'après partiellement l'application, il retourne une fonction, et en tant que telle fonctionne sur les fonctions - il est un HOF. Je ne pense pas que ce soit une façon particulièrement utile de décrire/apprendre le concept, mais je suppose que la définition engloberait à la fois les paramètres et les résultats.
Une version uncurried serait tout simplement groupe ses arguments:
plusUnc :: Num a => (a, a) -> a
Maintenant, une HOF peut prendre une telle fonction et la transformer en une autre:
imu :: Num a => (a -> a -> a) -> (a -> a -> a)
imu f = \a b -> f a b
Remarque : Le lambda impl pourrait évidemment être simplifié, je l'ai épelé juste à titre d'illustration.
Notez que f
est la fonction de commande « inférieur » qui est en cours passé dans imu
. Pour l'utiliser:
imuPlus = imu plusc -- a function is being passed
imuPlus 1 2 -- == 3
Note: puisque nous mélangeons les deux concepts (et vous a demandé pour les deux), imu
est également cari. Une version uncurried pourrait ressembler à ceci:
imuUnc :: ((a -> a -> a), (a, a)) -> a
Maintenant, il est un HOF (il a une fonction dans les paramètres), mais il ne retourne pas une fonction, qui diffère des exemples ci-dessus. Il est cependant beaucoup plus facile à utiliser quand il est au curry, principalement à cause d'une application partielle.
Dans quelle mesure?Je ne suis pas sûr de ce que vous demandez exactement, ou quelle partie vous ne comprenez pas. – Bergi
Eh bien, je ne comprends pas comment cette fonction représente un ajout. Dans quelle mesure la définition de la fonction * définit * une addition. –
L'addition est définie par l'opérateur '+', que 'plusc' utilise. Peut-être que cela aide à écrire 'plusc xy = x + y' ou' plusc = \ x -> \ y -> x + y' (qui sont juste du sucre syntaxique l'un pour l'autre, comme 'x + y' =' (+) xy') – Bergi