Quels sont les usages de la fonction id en Haskell?
Réponses
Trop de publicités?Il est utile en tant qu'argument à des fonctions d'ordre supérieur (fonctions qui prennent des fonctions comme arguments), où voulez-vous un peu particulier, la valeur reste inchangée.
Exemple 1: Laisser une valeur uniquement si c'est dans un Juste, sinon, retourner une valeur par défaut de 7.
Prelude Data.Maybe> :t maybe
maybe :: b -> (a -> b) -> Maybe a -> b
Prelude Data.Maybe> maybe 7 id (Just 2)
2
Exemple 2: construction d'une fonction par un pli:
Prelude Data.Maybe> :t foldr (.) id [(+2), (*7)]
:: (Num a) => a -> a
Prelude Data.Maybe> let f = foldr (.) id [(+2), (*7)]
Prelude Data.Maybe> f 7
51
Nous avons construit une nouvelle fonction f
par pliage d'une liste de fonctions en collaboration avec (.)
, à l'aide de id
comme le cas de base.
Exemple 3: le cas de base pour les fonctions comme monoids (simplifié).
instance Monoid (a -> a) where
mempty = id
f `mappend` g = (f . g)
Semblable à notre exemple, les plier, les fonctions peuvent être traités comme des concatenable de valeurs, id
servir pour le caisson vide, et (.)
que append.
Exemple 4: un triviaux de la fonction de hachage.
Data.HashTable> h <- new (==) id :: IO (HashTable Data.Int.Int32 Int)
Data.HashTable> insert h 7 2
Data.HashTable> Data.HashTable.lookup h 7
Just 2
Les tables de hashage besoin d'une fonction de hachage. Mais que faire si votre clé est déjà haché? Ensuite transmettre l'id de fonction, remplir comme votre méthode de hachage, avec zéro sur les performances système.
Si vous manipulez des nombres, en particulier avec addition et multiplication, vous aurez remarqué l'utilité de 0 et 1. De même, si vous manipulez des listes, la liste vide s'avère très pratique. De même, si vous manipulez des fonctions (très courantes dans la programmation fonctionnelle), vous remarquerez le même type d’utilité de id
.
Dans les langages fonctionnels, les fonctions sont des valeurs de première classe que vous pouvez transmettre en tant que paramètre. Donc, l’une des utilisations les plus courantes de id
apparaît lorsque vous transmettez une fonction en tant que paramètre à une autre fonction pour lui indiquer quoi faire. L'un des choix de ce qu'il faut faire est susceptible d'être "laissez simplement cela seul" - dans ce cas, vous passez id
tant que paramètre.
Supposons que vous êtes à la recherche d'une sorte de solution à un casse-tête où vous faire bouger à chaque tour. Vous commencez avec un candidat à la position pos
. À chaque étape, il y a une liste de transformations possibles vous pourriez apporter à pos
(eg. en glissant une pièce dans le puzzle). Dans un langage fonctionnel, il est naturel de représenter les transformations que les fonctions alors maintenant, vous pouvez faire une liste de coups à l'aide d'une liste de fonctions. Si "ne rien faire" est un mouvement dans ce puzzle, vous déclarez que avec id
. Si vous n'avez pas à faire cela, alors vous auriez besoin pour gérer à "ne rien faire" est un cas particulier qui fonctionne différemment de "faire quelque chose". En utilisant id
vous pouvez gérer tous les cas de manière uniforme dans une liste unique.
C'est probablement la raison pour laquelle presque toutes les utilisations de l' id
existent. Pour gérer à "ne rien faire" uniformément "faire quelque chose".
Pour un autre type de réponse:
Je le ferai souvent lorsque plusieurs fonctions seront chaînées via la composition:
foo = id
. bar
. baz
. etc
plus de
foo = bar
. baz
. etc
Cela garde les choses plus faciles à éditer. On peut faire la même chose avec d’autres éléments «zéro», tels que
foo = return
>>= bar
>>= baz
foos = []
++ bars
++ bazs