Il est utile comme un argument de des fonctions d'ordre supérieur (les 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: la 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 751
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 à celui de notre exemple avec pli, les fonctions peuvent être traités comme des concatenable valeurs, avec id de 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 72
Data.HashTable> Data.HashTable.lookup h 7
Just 2
Tables de hachage 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.
Serait-il préférable d'utiliser foldl' (.) id sur foldr (.) id?
Pas dans ce cas. La rigueur de ne pas avoir un quelconque effet sur la fonction de la composition.
Stewart, j'espère compilateur de faire quelque chose de terrible mal avec certaines fonctions (comme (+) et d'autres étrangères-fonctions qui nécessite à la fois des arguments à être lié), comme le changement de l'arbre de l'application à la fois des nœuds et de libérer la mémoire utilisée par eux.
Il y a une différence: foldl' (.) id (repeat (const 0)) 0 vs foldr (.) id (repeat (const 0)) 0.
sdcvvc, bien repéré, mais foldl a la même propriété. (le " n'est pas la question).
Un autre exemple est lié à ce qui l'aide id que la fonction de base dans la Continuation Passing Style (CPS).
L'un de mes favoris: numberOfTrues :: [Bool] -> Int; numberOfTrues = length . filter id
une autre façon amusante d'écrire que l'on est numberOfTrues = sum . map fromEnum.
Si vous manipuler les nombres, en particulier avec l'addition et la multiplication, vous aurez remarqué l'utilité de 0 et de 1. De même, si vous manipuler les listes, la liste vide s'avère être très pratique. De même, si vous manipulez des fonctions (très commun dans la programmation fonctionnelle), vous arriverez à un avis de la même trier de l'utilité de id.
Monsieur, il m'a fallu juste un lire pour comprendre id. Je vous remercie.
Dans les langages fonctionnels, les fonctions sont des valeurs de première classe
que vous pouvez passer en paramètre.
Ainsi, l'une des utilisations les plus courantes de id vient quand
vous passer une fonction comme
paramètre d'une autre fonction pour lui dire quoi faire.
Un des choix de quoi faire est susceptible d'être
"laisser tranquille" - dans ce cas, vous passez id
en tant que paramètre.
just leave it alone est la partie qui m'a fait cliquer, merci!
Un des choix de quoi faire, c'est probablement "laisser tranquille" - dans ce cas, vous passez id que le paramètre voulez-vous dire le comportement polymorphique de la fonction Sens HOF a été déjà accepter une certaine fonction comme argument avec la signature de T>T je.e entrée et o/p type sont les mêmes et dans certaines conditions, vous pouvez passer l'Id de la fonction, qui ont aussi des i/p et p/p de même type plus la même valeur même ?
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 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 id existent. Pour gérer à "ne rien faire" uniformément "faire quelque chose".
Entendez-vous le comportement polymorphique de la fonction Sens HOF a été déjà accepter une certaine fonction comme argument avec la signature de T>T je.e entrée et o/p type sont les mêmes et dans certaines conditions, vous pouvez passer l'Id de la fonction, qui ont aussi des i/p et p/p de même type plus la même valeur même ?
Intelligent, mais ne vous vraiment le faire dans le code réel? Cela a failli me fait long pour Java.
Je le fais dans le code réel, si les compositions ne s'intègrent pas parfaitement sur une seule ligne. Cela se produit généralement lorsque le nom de la fonction est long et/ou il y a beaucoup de pointful paramètres.
Puisque nous sommes à trouver belles applications de id. Ici, un palindrome 🙂
import Control.Applicative
pal ::[a]->[a]
pal =(++)<$> id <*> reverse
Wow, quelqu'un peut m'expliquer comment cela fonctionne?
ici:) <*> reverse suggère instance Applicative ((->) r) où (f <*> g) x = f x (g x) et ($) = (.) donc pal x = ((++).id) x (reverse x) = x ++ reverse x. (cela montre pal = (++) <*> reverse marche aussi).
Imaginez que vous êtes un ordinateur, c'est à dire que vous pouvez exécuter une séquence d'étapes. Ensuite, si je veux que vous restiez dans votre état actuel, mais j'ai toujours pour vous donner une instruction (je ne peux pas muet et laisser le temps passer), ce que l'instruction dois-je vous donner? Id est la fonction créée pour qui, pour retourner l'argument inchangé (dans le cas de l'ordinateur précédent l'argument serait de son état) et pour avoir un nom. Cette nécessité apparaît uniquement lorsque vous avez de hautes fonctions d'ordre, lorsque vous utilisez les fonctions sans tenir compte de ce qui est à l'intérieur, qui vous oblige à représenter symboliquement, même "ne rien faire" de la mise en œuvre. Par analogie, 0 considérée comme une quantité de quelque chose, est un symbole de l'absence de quantité. En fait dans l'Algèbre à la fois 0 et id sont considérés comme les éléments neutres de l'exploitation + et ∘ (composition de fonctions) respectivement, ou plus formellement:
Toutes les fois que vous besoin d'avoir une fonction quelque part, mais que vous voulez faire plus que simplement tenir sa place (avec 'undefined', comme un exemple).
Il est également utile, comme (bientôt-à-être) le Dr Stewart mentionné ci-dessus, si vous avez besoin de passer une fonction comme argument d'une autre fonction:
join =(>>= id)
ou comme le résultat d'une fonction:
let f = id in f 10
(probablement, vous allez modifier la fonction ci-dessus plus tard pour faire quelque chose de plus "intéressant"... 😉
Comme d'autres l'ont mentionné, id est un endroit merveilleux-support pour quand vous avez besoin d'une fonction quelque part.
Il est utile comme un argument de des fonctions d'ordre supérieur (les 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.
Exemple 2: la construction d'une fonction par un pli:
Nous avons construit une nouvelle fonction
f
par pliage d'une liste de fonctions en collaboration avec(.)
, à l'aide deid
comme le cas de base.Exemple 3: le cas de base pour les fonctions comme monoids (simplifié).
Semblable à celui de notre exemple avec pli, les fonctions peuvent être traités comme des concatenable valeurs, avec
id
de servir pour le caisson vide, et(.)
que append.Exemple 4: un triviaux de la fonction de hachage.
Tables de hachage 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.
foldl' (.) id
surfoldr (.) id
?(+)
et d'autres étrangères-fonctions qui nécessite à la fois des arguments à être lié), comme le changement de l'arbre de l'application à la fois des nœuds et de libérer la mémoire utilisée par eux.foldl' (.) id (repeat (const 0)) 0
vsfoldr (.) id (repeat (const 0)) 0
.id
que la fonction de base dans la Continuation Passing Style (CPS).numberOfTrues :: [Bool] -> Int; numberOfTrues = length . filter id
numberOfTrues = sum . map fromEnum
.Si vous manipuler les nombres, en particulier avec l'addition et la multiplication, vous aurez remarqué l'utilité de 0 et de 1. De même, si vous manipuler les listes, la liste vide s'avère être très pratique. De même, si vous manipulez des fonctions (très commun dans la programmation fonctionnelle), vous arriverez à un avis de la même trier de l'utilité de
id
.id
. Je vous remercie.Dans les langages fonctionnels, les fonctions sont des valeurs de première classe
que vous pouvez passer en paramètre.
Ainsi, l'une des utilisations les plus courantes de
id
vient quandvous passer une fonction comme
paramètre d'une autre fonction pour lui dire quoi faire.
Un des choix de quoi faire est susceptible d'être
"laisser tranquille" - dans ce cas, vous passez
id
en tant que paramètre.
just leave it alone
est la partie qui m'a fait cliquer, merci!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 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 avecid
. 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 utilisantid
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
id
existent. Pour gérer à "ne rien faire" uniformément "faire quelque chose".Pour un autre type de réponse:
Je vais souvent faire quand le chaînage de plusieurs fonctions via composition:
sur
Cela rend les choses plus faciles à modifier. On peut faire des choses similaires avec d'autres "zéro" éléments, tels que
Je peux aussi vous aider à améliorer votre pointage de golf. Au lieu d'utiliser
($)
vous pouvez enregistrer un seul personnage en utilisant les id.
par exemple
zipWith id [(+1), succ] [2,3,4]
Intéressant, plus que le résultat utile.
zipWith($)[][]
vszipWith id[][]
.Puisque nous sommes à trouver belles applications de
id
. Ici, un palindrome 🙂<*> reverse
suggèreinstance Applicative ((->) r)
où(f <*> g) x = f x (g x)
et($) = (.)
doncpal x = ((++).id) x (reverse x) = x ++ reverse x
. (cela montrepal = (++) <*> reverse
marche aussi).Imaginez que vous êtes un ordinateur, c'est à dire que vous pouvez exécuter une séquence d'étapes. Ensuite, si je veux que vous restiez dans votre état actuel, mais j'ai toujours pour vous donner une instruction (je ne peux pas muet et laisser le temps passer), ce que l'instruction dois-je vous donner? Id est la fonction créée pour qui, pour retourner l'argument inchangé (dans le cas de l'ordinateur précédent l'argument serait de son état) et pour avoir un nom. Cette nécessité apparaît uniquement lorsque vous avez de hautes fonctions d'ordre, lorsque vous utilisez les fonctions sans tenir compte de ce qui est à l'intérieur, qui vous oblige à représenter symboliquement, même "ne rien faire" de la mise en œuvre. Par analogie, 0 considérée comme une quantité de quelque chose, est un symbole de l'absence de quantité. En fait dans l'Algèbre à la fois 0 et id sont considérés comme les éléments neutres de l'exploitation + et ∘ (composition de fonctions) respectivement, ou plus formellement:
pour tout x de numéro de type:
pour tout f de type fonction:
Toutes les fois que vous besoin d'avoir une fonction quelque part, mais que vous voulez faire plus que simplement tenir sa place (avec 'undefined', comme un exemple).
Il est également utile, comme (bientôt-à-être) le Dr Stewart mentionné ci-dessus, si vous avez besoin de passer une fonction comme argument d'une autre fonction:
ou comme le résultat d'une fonction:
(probablement, vous allez modifier la fonction ci-dessus plus tard pour faire quelque chose de plus "intéressant"... 😉
Comme d'autres l'ont mentionné,
id
est un endroit merveilleux-support pour quand vous avez besoin d'une fonction quelque part.