8
votes

Qu'est-ce que '((->) a) signifie?

J'ai vu ce type avant sans savoir ce que cela signifie. Ça veut dire quelque chose et / ou a-t-il un nom? XXX


2 commentaires

C'est la flèche de fonction ordinaire écrite sous forme de préfixe. C'est-à-dire que (->) a b est identique à celui a -> b .


Si vous aimez (3 +) au lieu de ((+) 3) , vous pouvez penser à ((->) a) comme < Code> (a ->) - Même si ce n'est pas une syntaxe valide, cela vous donne une idée de ce que c'est.


3 Réponses :


5
votes

in Haskell, (->) A est de a -> quelque chose . N'oubliez pas que vous pouvez transformer un opérateur en une fonction préfixée à l'aide de Parans. Ie (+) 1 1 == 2 . Donc, dans ce cas, l'opérateur est le constructeur de type -> . Il est utilisé de cette façon, car un foncteur a besoin d'un constructeur de type avec 1 variable, mais -> a 2. donc nous l'appliquons partiellement.

Cela peut vous aider à réaliser que <$> pour ((->) a) est juste (.)


4 commentaires

Je vois, donc ((->) a) a type * -> * ?


Pour être un peu plus explicite, j'ajouterais que (->) a type * -> * -> * tandis que (->) A a genre * -> * .


@Carlos no, ((->) A n'est pas un type! Mais si vous êtes / type / type /, c'est correct.


D'accord, je l'obtiens maintenant. Merci :)



9
votes

en fait, ((->) a) n'est pas un type mais un constructeur de type .

Tout comme des fonctions, les constructeurs de type peuvent être partiellement appliqués. dans HASKELLL.

Vous pouvez vérifier le type type de quelque chose dans ghci: xxx

toutes les valeurs ont types de type * ; Les constructeurs de types ont des types comme * -> * , * -> * -> *


1 commentaires

Mode de pédantisme: Toutes les valeurs ont types de type * .



5
votes

Pour ajouter aux réponses plus techniques de Matt Fenwick et Josefg, le ((->) A code> peut être lu comme constructeur de type qui forme des valeurs qui dépendent d'un A code> . Un exemple: Supposons que vous ayez des équipes dont l'adhésion varie au fil du temps. Un moyen possible de représenter c'est comme ceci: xxx pré>

((->) a) code> est un foncteur code>, applicatif code> et monad code>, ce qui signifie que les opérations de classe de type sont disponibles et ont des interprétations très utiles lorsqu'elles sont utilisées avec Historique t code>. P>

premier exemple: fmap code> applique une fonction à une valeur dépendante du temps. Ainsi, par exemple, P>

personToManager :: Person -> Historical Day Manager
personToManager = ...

managerToVP :: Manager -> Historical Day VP
managerToVP = ...

personToVP :: Person -> Historical Day VP
personToVP p = personToManager p >>= managerToVP


0 commentaires