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.
Réponses:
Il n'y a pas de différence. Depuis
a
,b
etc
commencez 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
a
par exemple enb
dans votre premier fragment de code, nous obtiendrionsb -> 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.la source
Nan. Pensez
a -> b -> a
àThis Type -> Another Type -> This Type
. Ensuite, les deux correspondent à un modèle donné. Cependant, quelque chose commea -> b -> c
ne rentre pas:This Type -> That Type -> Yet Another Type
est (généralement) différent; sauf le cas de bord quandc = a
, ce qui donne le motif qui vous intéresse.la source