Haskell - Functeur

Functordans Haskell est une sorte de représentation fonctionnelle de différents types qui peuvent être mappés. C'est un concept de haut niveau de mise en œuvre du polymorphisme. Selon les développeurs Haskell, tous les types tels que List, Map, Tree, etc. sont l'instance du Haskell Functor.

UNE Functor est une classe intégrée avec une définition de fonction comme -

class Functor f where 
   fmap :: (a -> b) -> f a -> f b

Par cette définition, nous pouvons conclure que le Functor est une fonction qui prend une fonction, disons, fmap()et renvoie une autre fonction. Dans l'exemple ci-dessus,fmap() est une représentation généralisée de la fonction map().

Dans l'exemple suivant, nous verrons comment fonctionne Haskell Functor.

main = do  
   print(map (subtract 1) [2,4,8,16])      
   print(fmap (subtract 1) [2,4,8,16])

Ici, nous avons utilisé les deux map() et fmap()sur une liste pour une opération de soustraction. Vous pouvez observer que les deux instructions donneront le même résultat d'une liste contenant les éléments [1,3,7,15].

Les deux fonctions appelées une autre fonction appelée subtract() pour donner le résultat.

[1,3,7,15]
[1,3,7,15]

Alors, quelle est la différence entre map et fmap? La différence réside dans leur utilisation. Functor nous permet d'implémenter plus de fonctionnalistes dans différents types de données, comme «juste» et «rien».

main = do 
   print (fmap  (+7)(Just 10)) 
   print (fmap  (+7) Nothing)

Le morceau de code ci-dessus donnera la sortie suivante sur le terminal -

Just 17
Nothing

Fonction applicative

Un foncteur applicatif est un foncteur normal avec quelques fonctionnalités supplémentaires fournies par la classe de type applicatif.

En utilisant Functor, nous mappons généralement une fonction existante avec une autre fonction définie à l'intérieur. Mais il n'y a aucun moyen de mapper une fonction qui est définie à l'intérieur d'un Functor avec un autre Functor. C'est pourquoi nous avons une autre installation appeléeApplicative Functor. Cette fonction de mappage est implémentée par la classe Applicative Type définie sous leControlmodule. Cette classe ne nous donne que deux méthodes pour travailler: l'une estpure et l'autre est <*>.

Voici la définition de classe du Functor Applicatif.

class (Functor f) => Applicative f where   
   pure :: a -> f a   
   (<*>) :: f (a -> b) -> f a -> f b

Selon l'implémentation, nous pouvons mapper un autre Functor en utilisant deux méthodes: "Pure" et "<*>". La méthode "Pure" doit prendre une valeur de n'importe quel type et elle retournera toujours un Functor Applicatif de cette valeur.

L'exemple suivant montre comment fonctionne un fonction applicative -

import Control.Applicative 

f1:: Int -> Int -> Int 
f1 x y = 2*x+y  
main = do  
   print(show $ f1 <$> (Just 1) <*> (Just 2) )

Ici, nous avons implémenté des foncteurs applicatifs dans l'appel de fonction de la fonction f1. Notre programme produira le résultat suivant.

"Just 4"

Monoïdes

Nous savons tous que Haskell définit tout sous forme de fonctions. Dans les fonctions, nous avons des options pour obtenir notre entrée en tant que sortie de la fonction. C'est ce qu'unMonoid est.

UNE Monoidest un ensemble de fonctions et d'opérateurs où la sortie est indépendante de son entrée. Prenons une fonction (*) et un entier (1). Maintenant, quelle que soit l'entrée, sa sortie ne restera que le même numéro. Autrement dit, si vous multipliez un nombre par 1, vous obtiendrez le même nombre.

Voici une définition de classe de type de monoïde.

class Monoid m where  
   mempty :: m 
   mappend :: m -> m -> m  
   mconcat :: [m] -> m 
   mconcat = foldr mappend mempty

Jetez un œil à l'exemple suivant pour comprendre l'utilisation de Monoid dans Haskell.

multi:: Int->Int 
multi x = x * 1 
add :: Int->Int 
add x = x + 0 

main = do  
   print(multi 9)  
   print (add 7)

Notre code produira la sortie suivante -

9
7

Ici, la fonction "multi" multiplie l'entrée par "1". De même, la fonction "ajouter" ajoute l'entrée avec "0". Dans les deux cas, la sortie sera la même que l'entrée. Par conséquent, les fonctions{(*),1} et {(+),0} sont les parfaits exemples de monoïdes.