Comment (-) peut-il avoir apparemment deux types différents?

12

En ghci, quand je tape

:t (-)

pour comprendre le type de (-), il retourne

(-) :: Num a => a -> a -> a

Cependant, lorsque j'écris, -1haskell renvoie un nombre, ce qui semble impliquer qu'il (-)est de type Num a => a -> a. Comment peut (-)apparemment avoir deux types différents?

TippFehler
la source

Réponses:

15

C'était une décision de conception dans la langue. -1est un nombre, mais son utilisation dans ce contexte n'est pas liée à la fonction(-) . (Comme Ackdari le mentionne dans leur réponse, cette utilisation est liée à la fonction negate.) Il existe quelques compromis qui permettent à cela de fonctionner:

  1. Vous ne pouvez pas prendre une tranche droite de l' (-)opérateur. Comme solution de contournement, Haskell fournit la subtractfonction.

  2. Vous ne pouvez pas écrire un entier négatif sans parenthèses sauf s'il se trouve au début d'une affectation (par exemple directement après =ou ->). Cela produit une erreur d'analyse:

    let x = 8 * -1

    Au lieu de cela, il devrait être écrit comme

    let x = 8 * (-1)

    Cependant, c'est très bien:

    let x = -1 * 8

Ceux-ci ont été considérés comme des compromis raisonnables pour les concepteurs de la langue.

Andrew Ray
la source
8

La réponse est déjà contournée dans le haskell-wiki , indique-t-elle

Le moins unaire est le sucre syntaxique pour la fonction Prélude negate

donc la fonction (-)est toujours la a - bfonction et si vous écrivez du code comme let x = -yle compilateur le traduira let x = negate y.

Ackdari
la source
7

Unary moins est spécial à Haskell. Comme indiqué dans la section 3.4 du rapport :

La forme spéciale dénote la négation du préfixe, le seul opérateur de préfixe dans Haskell, et est la syntaxe de . L' opérateur binaire ne fait pas nécessairement référence à la définition de dans le Prélude; il peut être rebondi par le système de modules. Cependant, unaire fera toujours référence à la fonction définie dans le Prélude. Il n'y a pas de lien entre la signification locale de l' opérateur et la négation unaire.-enegate (e)---negate-

bipll
la source
2
Les réponses en une phrase sont déconseillées sur SO, tout comme les liens sans résumé de leur contenu, car ils peuvent se briser.
Andrew Ray
Comme puis-je supposer que les liens vers des rapports / normes sont également très pessimisés par rapport aux wikis / tutoriels / vidéos youtube?
bipll
@bipll Oui. Le problème avec les réponses de lien uniquement n'est pas la qualité de la cible du lien, mais plutôt le risque de pourriture du lien. Si vous avez copié dans la section pertinente du rapport, votre réponse serait parfaite.
Joseph Sible-Reinstate Monica