0

J'étudie actuellement la programmation fonctionnelle et sa fonction la plus importante: les fonctions d'ordre supérieur.Comprendre la programmation et les HOF

Ce n'est pas aussi clair que je le voudrais actuellement et donc je voudrais comprendre parfaitement comment fonctionnent les HOF.

Compte tenu de cette fonction

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

Dans quelle mesure peut-on dire que cette fonction utilise Currying et est un HOF?

EDIT: En fait, je ne comprends pas comment la définition de la fonction est une addition (paramètres, associativité, etc.)

+0

Dans quelle mesure?Je ne suis pas sûr de ce que vous demandez exactement, ou quelle partie vous ne comprenez pas. – Bergi

+0

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. –

+1

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

Répondre

0

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.

+0

L'ordre supérieur peut également signifier qu'une fonction renvoie une autre fonction, ce qui est assez standard pour les fonctions curry de Haskell bien – Bergi

+0

@Bergi oh bien, d'accord, * renvoyer * une fonction pourrait peut-être aussi faire une fonction HOF; Je l'examine très rarement de cette façon, mais je vais l'éditer. –

+0

@Bergi Dans Haskell, je pense aussi rarement aux fonctions de retour de fonction comme HOF, mais je suppose que cela pourrait encore convenir. Je serais probablement plus tenté d'appeler 'plusc' un HOF parce que la contrainte' Num a => 'passe implicitement un dictionnaire contenant un tas de fonctions à' plusc'. Pourtant, je pense que la terminologie "HOF" n'est plus si utile de nos jours - HOFs sont devenus trop communs pour les remarquer. – chi