Envoyé par
gg373
Et de suivre la définition suivante :
newtype Pair a b = Pair (forall c. (a->b->c)->c)
Et pas d'autre explication.
Je ne sais pas si tu as compris depuis, mais au cas où, je vais tenter de te donner l'intuition de "pourquoi c'est bien comme une paire".
Alors, regardons le type de plus près. On va juste se concentrer sur:
forall c. (a -> b -> c) -> c
Il est important de voir qu'à ce point là de la définition, a et b sont déjà fixés, c'est "juste" des paramètres donnés à Pair. Pour encore moins se prendre la tête, on va même dire que a = Int et b = Float comme dans ton exemple.
Ca donne:
forall c. (Int -> Float -> c) ->c
On voit que c'est le type d'une fonction. Comment une fonction peut être une paire? Techniquement, cette fonction n'est pas comme (,), évidemment.
Ce que le type nous dit par contre, c'est: "pour tout type c, si tu me donnes une fonction de type Int -> Float -> c, je te donne un c.
Sauf que ta valeur de type 'Pair Int Float' peut faire ça pour tout type c, cette seule et unique valeur de type Pair Int Float que t'as sous la main peut faire ça. Mais comment? On peut imaginer que ç'a un lien avec la fonction qu'elle prend en argument, mais il lui faudrait un Int et un Float pour pouvoir avoir un c, on est d'accord? Sinon, on pourrait faire marcher des idées pour des c bien particuliers, mais pas pour tous à la fois! Bah, avoir un Int et un Float, c'est pas ça une paire consistant d'un Int et un Float?
Partager