Cette question est une question théorique sur les fonctions Haskell qui peuvent prendre des arguments de tout type. Y a-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.
Il n'y a pas de différence. Puisque a
, b
et c
commencent par en minuscules, ce sont variables. Vous pouvez renommer des variables, et cela reste le même, tant que deux (ou plus) variables ne "clash".
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 a
par exemple en b
dans votre premier fragment de code, nous obtiendrions b -> b -> b
, mais ce n'est pas la même chose, puisque 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 les mêmes, mais c'est pas nécessaire.
Nan. Penser à a -> b -> a
comme This Type -> Another Type -> This Type
. Ensuite, les deux correspondent à un modèle donné. Cependant, quelque chose comme a -> b -> c
ne convient pas: This Type -> That Type -> Yet Another Type
est (généralement) différent; sauf le cas Edge lorsque c = a
, ce qui donne le motif qui vous intéresse.