Comment déterminer haskell l'ordre des variables de type à foralls implicites?

voix
15

Donc , je viens récemment appris et commencé à utiliser TypeApplications, et je me demandais comment nous pouvons savoir généralement quelles sont les variables type que nous assignons. La documentation sur TypeApplicationsj'ai trouvé mentionne:

Quel ordre est utilisé pour instancier les variables de type?

à droite gauche ordre des variables de type apparaissant dans les foralls. Ceci est l'ordre le plus logique qui se produit lorsque l'instanciation se fait au niveau du type variable. Emboîtés foralls fonctionnent un peu différemment, mais à un seul emplacement forall avec plusieurs variables, de gauche à droite a lieu. (Voir ci-dessous pour foralls emboîtés).

Cependant , je ne l' ai pas mentionné comment trouver l' ordre des variables de type à foralls implicite est déterminée. J'essayé de regarder différents exemples avec -fprint-explicit-forallspour voir s'il y avait un modèle simple, mais je reçois des résultats différents dans les différentes versions de ghci. : /

Dans la version 8.0.2 ghci, je reçois:

> :t (,,)
(,,) :: forall {c} {b} {a}. a -> b -> c -> (a, b, c)

tandis que dans la version 8.4.3 ghci, je reçois:

> :t (,,)
(,,) :: forall {a} {b} {c}. a -> b -> c -> (a, b, c)

Là encore, peut-être c'est tout simplement un bug dans la façon dont foralls étaient imprimés en 8.0.2, car le type sinon les applications semblent faire droit à gauche avec les variables de forall, contrairement à ce que dit la documentation:

> :t (,,) @Bool
(,,) @Bool :: forall {c} {b}. Bool -> b -> c -> (Bool, b, c)

Ainsi, sont des variables de type mises en foralls implicites toujours dans l'ordre dans lequel ils apparaissent d'abord à gauche à droite dans le corps de type (y compris les contraintes)?

Créé 20/10/2018 à 03:05
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
16

TL; DR: Type d' ordre variable est déterminée par la première à gauche à droite rencontre. En cas de doute, utilisez :type +v.

Ne pas utiliser :type

L' utilisation :typeest trompeuse ici. :typeinfère le type d'une expression entière. Alors , quand vous écrivez :t (,), le vérificateur de type regarde

(,) :: forall a b. a -> b -> (a, b)

et instancie toutes les forall de variables de type frais

(,) :: a1 -> b1 -> (a1, b1)

ce qui est nécessaire si vous voulez appliquer (,). Hélas, vous ne pas, donc l' inférence de type est presque terminé, et il généralise sur toutes les variables libres, et vous obtenez, par exemple,

(,) :: forall {b} {a}. a -> b -> (a, b)

Cette étape ne donne aucune garantie sur l'ordre de la variable libre, et le compilateur est libre de changer.

Notez également qu'il écrit au forall {a}lieu de forall a, ce qui signifie que vous ne pouvez pas utiliser l' application de type visible ici.

Utilisation :type +v

Mais bien sûr , vous pouvez utiliser (,) @Bool- mais ici le vérificateur de type traite la première expression différemment et ne fait pas cette étape instanciation / généralisation.

Et vous pouvez obtenir ce comportement dans GHCi aussi bien - passer +và:type :

:type +v (,)
(,) :: forall a b. a -> b -> (a, b)
:type +v (,) @Bool
(,) @Bool :: forall b. Bool -> b -> (Bool, b)

Regardez, pas de {…}type autour des variables!

D'où vient cet ordre vient?

La la section Guide de l' utilisateur GHC sur l' application de type visible états:

Si la signature de type d'un identifiant ne comprend pas un forall explicite, le type des arguments variables apparaissent dans l'ordre à droite à gauche dans lequel les variables apparaissent dans le type. Alors, foo :: Monad m => ab -> m (ac) aura ses variables de type commandés en m, a, b, c.

Cela ne vaut que pour les choses qui ont une signature de type explicite. Il n'y a pas d' ordre garanti à des variables dans les types inférées, mais vous pouvez aussi ne pas utiliser des expressions avec des types inférées avec VisibleTypeApplication.

Créé 20/10/2018 à 09:40
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more