Y a-t-il une différence entre les signatures de type a -> b -> a et c -> a -> c?

16

Cette question est une question théorique sur les fonctions Haskell qui peuvent prendre des arguments de tout type. Existe-t-il une différence entre la façon dont les fonctions et les signatures de type de

a -> b -> a 

et

c -> a -> c 

sont instanciés? Toute aide est appréciée.

Dreana
la source
6
Non, vous avez simplement changé le nom des variables de type . Tant que vous ne renommez pas une variable en une autre variable (telle qu'il y a un conflit de noms), il n'y a pas de problème.
Willem Van Onsem
Dépend si / comment les variables de type sont liées ailleurs.
Bergi

Réponses:

17

Il n'y a pas de différence. Depuis a, bet ccommencez par des minuscules , ce sont des variables . Vous pouvez renommer des variables, et cela reste le même, tant que deux (ou plus) variables ne " s'affrontent " pas.

De tels conflits peuvent se produire si vous renommez une variable de sorte qu'elle porte le même nom qu'une autre variable, ou lorsque vous renommez deux (ou plus) variables avec le même nouveau nom. Si vous renommiez la variable apar exemple en bdans votre premier fragment de code, nous obtiendrions b -> b -> b, mais ce n'est pas la même chose, car nous imposons alors que le premier et le deuxième paramètre sont du même type. Alors que dans votre signature de type, nous avons la liberté de choisir deux types qui peuvent être identiques, mais ce n'est pas nécessaire.

Willem Van Onsem
la source
16

Nan. Pensez a -> b -> aà This Type -> Another Type -> This Type. Ensuite, les deux correspondent à un modèle donné. Cependant, quelque chose comme a -> b -> cne rentre pas: This Type -> That Type -> Yet Another Typeest (généralement) différent; sauf le cas de bord quand c = a, ce qui donne le motif qui vous intéresse.

Sereja Bogolubov
la source