60 votes

Utilisations de la fonction id Haskell

Quels sont les usages de la fonction id en Haskell?

81voto

Don Stewart Points 94361

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.

69voto

Conal Points 9874

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 .

21voto

Yitz Points 3262

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.

6voto

sigfpe Points 5200

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

3voto

Thomas Eding Points 8651

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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X