J'ai été faire mon habituel "Lire un chapitre de LYAH avant d'aller au lit" de routine, avoir l'impression que mon cerveau était en pleine expansion avec tous les exemples de code. À ce point, j'étais convaincu que j'ai compris le noyau de l'awesomeness de Haskell, et maintenant juste eu à comprendre les bibliothèques standard et type de classes afin que je puisse commencer à écrire de véritables logiciels.
J'ai donc été lire le chapitre sur les foncteurs applicatifs, lorsque tout à coup le livre affirmé que les fonctions ne se contente pas d'avoir des types, ils sont des types, et peuvent être traités en tant que tels (Par exemple, en faisant d'eux des instances de classes de type). (->) est un constructeur de type comme les autres.
Mon esprit a soufflé encore une fois, et j'ai immédiatement sauté hors du lit, au démarrage de l'ordinateur, est allé à GHCi et découvert les suivantes:
Prelude> :k (->)
(->) :: ?? -> ? -> *
- Que diable veut-il dire?
- Si (->) est un constructeur de type, ce sont la valeur des constructeurs? Je peux faire une supposition, mais elle n'aurait aucune idée de comment le définir traditionnels
data (->) ... = ... | ... | ...
format. Il est assez facile de faire cela avec n'importe quel autre type constructeur:data Either a b = Left a | Right b
. Je soupçonne mon incapacité à s'exprimer sous cette forme est liée à la extrêmement bizarre type de signature. - Qu'ai-je viens de tombé sur? Plus kinded types ont des signatures comme
* -> * -> *
. Venez pour penser à elle... (->) s'affiche dans le genre des signatures trop! Est-ce à dire que non seulement c'est un constructeur de type, mais aussi à une sorte de constructeur? Est-ce lié à la question des marques dans le type de signature?
J'ai lu quelque part (souhaite que je pourrais trouver encore une fois, Google ne parvient pas moi) au sujet d'être en mesure d'étendre les systèmes de type arbitraire de Valeurs, pour les Types de Valeurs, de Sortes de Types de Sortes de Sortes, à quelque chose d'autre de toutes Sortes, à quelque chose d'autre, quelque chose de elses, et ainsi de suite indéfiniment. Est-ce reflète dans le type de signature pour la (->)? Parce que j'ai également exécuter dans la notion de la Lambda cube et le calcul des constructions sans prendre vraiment le temps de les étudier, et si je me souviens bien il est possible de définir des fonctions qui prennent des types et des types de retour, les valeurs et les valeurs de retour, prenez les types et les valeurs de retour, et de prendre des valeurs des types de retour.
Si je devais prendre une deviner le type de signature, pour une fonction qui prend une valeur et renvoie un type, je serais probablement exprimer comme ceci:
a -> ?
ou, éventuellement,
a -> *
Bien que je ne vois pas les fondamentaux immuables raison pour laquelle le deuxième exemple, on ne pouvait pas facilement être interprétée comme une fonction à partir d'une valeur de type a à une valeur de type *, où * est juste un type synonyme de chaîne ou quelque chose.
Le premier exemple exprime mieux une fonction dont le type transcende une signature de type dans mon esprit: "une fonction qui prend une valeur de type a et renvoie à quelque chose qui ne peut être exprimée comme un type."