98 votes

Quel est l'intérêt de "const" dans le prélude Haskell?

En regardant à travers le prélude Haskell, je vois une fonction const :

 const x _ = x
 

Je n'arrive pas à trouver quelque chose de pertinent concernant cette fonction.

À quoi ça sert? Quelqu'un peut-il donner un exemple d'utilisation de cette fonction?

92voto

hammar Points 89293

C'est utile pour passer à des fonctions d'ordre supérieur lorsque vous n'avez pas besoin de toute leur flexibilité. Par exemple, l’opérateur de séquence monadique >> peut être défini en termes d’opérateur de liaison monadique comme suit:

 x >> y = x >>= const y
 

C'est un peu plus propre que d'utiliser un lambda

 x >> y = x >>= \_ -> y
 

et vous pouvez même l'utiliser sans aucun point

 (>>) = (. const) . (>>=)
 

bien que je ne le recommande pas particulièrement dans ce cas.

27voto

jberryman Points 6615

Pour ajouter à hammar excellente réponse directe: humble, comme les fonctions const et id sont vraiment utiles comme un ordre supérieur de la fonction pour la même raison qu'ils sont fondamentaux dans le SKI de combinateur de calcul.

Non pas que je pense haskell prélude fonctions ont été modélisés consciemment après que le système formel ou quoi que ce soit. C'est juste que la création de richesse abstractions en haskell est très facile, vous voyez souvent ces types d'théorique choses qui émergent comme dans la pratique.

Shameless plug, mais je postais un article sur la façon dont l'instance Applicative pour (->) sont en fait l' S et K combinators ici, si c'est le genre de chose qui vous intéresse.

24voto

Landei Points 30509

Un simple exemple pour l'utilisation d' const est Data.Functor.(<$). Avec cette fonction, vous pouvez dire: j'ai ici un foncteur avec quelque chose d'ennuyeux, mais au lieu de cela je veux avoir qu'autre chose intéressante dans ce, sans changer la forme du foncteur. E. g.

import Data.Functor

42 <$ Just "boring"
--> Just 42

42 <$ Nothing
--> Nothing

"cool" <$ ["nonsense","stupid","uninteresting"]
--> ["cool","cool","cool"]

La définition est la suivante:

(<$) :: a -> f b -> f a
(<$) =  fmap . const

ou écrit pas comme inutile:

cool <$ uncool =  fmap (const cool) uncool

Vous voyez comment const est utilisé ici pour "oublier" à propos de l'entrée.

15voto

Jonas Duregård Points 495

Une autre utilisation consiste à implémenter des fonctions de membre de classe ayant un argument factice qui ne doit pas être évalué (utilisé pour résoudre des types ambigus). Exemple qui pourrait être dans Data.bits:

 instance Bits Int where
  isSigned = const True
  bitSize  = const wordSize
  ...
 

En utilisant const, nous disons explicitement que nous définissons des valeurs constantes.

Personnellement, je n'aime pas utiliser les paramètres factices, mais s'ils sont utilisés dans une classe, c'est une manière plutôt agréable d'écrire des instances.

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