Ce qui est un plus kinded type de Scala?
Vous pouvez trouver les informations suivantes sur le web:
-
Plus kinded type == type constructeur?
class AClass[T]{...} //For example, class List[T]
Certains disent que c'est un plus kinded type, parce qu'il
les résumés de plus de types qui serait compatible avec la définition.Plus kinded types sont des types qui prennent d'autres types et de construire un nouveau type de
Ces cependant sont également connus comme constructeur de type. (Par exemple, dans La programmation Scala).
-
Plus kinded type == type constructeur qui prend constructeur de type, comme un paramètre de type?
Dans le papier Les génériques d'un Genre Plus élevé, vous pouvez lire
... types abstraits sur les types abstraits de plus de types de
('plus-kinded types') ..."qui suggère que
class XClass[M[T]]{...} //or trait YTrait[N[_]]{...} //e.g. trait Functor[F[_]]
est plus kinded type.
Donc, avec cela à l'esprit, il est difficile de distinguer entre constructeur de type, plus kinded type et type constructeur qui prend type de constructeurs comme paramètre de type, par conséquent, la question ci-dessus.
- Ajouté Landei du Foncteur comme exemple.
Vous devez vous connecter pour publier un commentaire.
Laissez-moi, pour commencer une partie de cette confusion par le tangage avec une certaine ambiguïté. J'aime utiliser l'analogie de la valeur de niveau d'expliquer cela, car les gens ont tendance à être plus familier avec elle.
Valeur les constructeurs sont généralement appelées "fonctions" ou "méthodes". Ces "constructeurs" sont également dit d'être "polymorphe" (parce qu'ils peuvent être utilisés pour construire des "trucs" de la variable "forme"), ou "abstractions" (puisqu'ils abstraite sur ce qui varie entre les différents polymorphes instanciations).
Dans le contexte de l'abstraction/polymorphisme, de premier ordre se réfère à "usage unique" de l'abstraction: vous abstraites sur un type une fois, mais que le type lui-même ne peut pas abstraite sur quoi que ce soit. Java 5 les génériques sont de premier ordre.
Du premier ordre interprétation des caractérisations d'abstractions sont:
À souligner, il n'y a pas d'abstraction impliqués (je suppose que vous pourriez appeler cela "d'ordre zéro", mais je n'ai pas vu ce utilisé n'importe où), comme la valeur
1
ou le typeString
, nous avons l'habitude de dire que quelque chose est une "bonne" valeur ou le type.Une valeur correcte est "immédiatement utilisables" dans le sens où il n'est pas d'attente pour les arguments (ce n'est pas abstraite au-dessus d'eux). Pensez à eux comme des valeurs que vous pouvez facilement imprimer/inspecter (sérialisation d'une fonction est de la triche!).
Un bon type est un type qui classe les valeurs (y compris la valeur des constructeurs), tapez les constructeurs ne permettent pas de considérer toutes les valeurs (ils doivent d'abord être appliquée à ce type d'arguments pour produire un bon type). Pour instancier un type, il est nécessaire (mais pas suffisante) pour être un bon type. (Peut-être une classe abstraite ou une classe que vous n'avez pas accès à.)
"D'ordre supérieur" est simplement un terme générique qui désigne l'utilisation répétée de polymorphisme/abstraction. Il signifie la même chose pour les types polymorphes et des valeurs. Concrètement, d'un ordre supérieur d'abstraction des résumés sur quelque chose que les résumés de plus de quelque chose. Pour les types, le terme "plus-kinded" est une version de la plus générale "d'ordre supérieur".
Ainsi, l'ordre supérieur version de notre caractérisation devient:
Ainsi, "d'ordre supérieur" signifie simplement que lorsque vous dites "l'abstraction de plus de X", vous vraiment! Le
X
qui est une abstraction de plus de ne pas perdre sa propre "de l'abstraction des droits de l'": - il possible de faire abstraction de tout ce qu'elle veut. (En passant, j'utilise le verbe "abstrait" ici signifie: laisser quelque chose qui n'est pas essentiel pour la définition d'une valeur ou d'un type, de sorte qu'il peut être modifiée et/ou fourni par l'utilisateur de l'abstraction comme un argument.)Voici quelques exemples (inspiré par Lutz questions par e-mail) de bon, de premier ordre et d'ordre supérieur de valeurs et types:
Où les classes utilisées sont définies comme suit:
Pour éviter l'indirection par le biais de la définition des classes, vous devez en quelque sorte express anonyme de type de fonctions, qui ne sont pas exprimable directement à la Scala, mais vous pouvez utiliser les types de construction sans trop syntaxique, les frais généraux (la
#λ
style est due à https://stackoverflow.com/users/160378/retronym autant que je sache):Dans une hypothétique future version de Scala qui prend en charge anonyme de type de fonctions, vous pouvez raccourcir la dernière ligne de l'exemple à:
(Sur une note personnelle, je regrette de l'avoir jamais parlé de "plus-kinded types", ils sont juste des types après tout! Lorsque vous avez absolument besoin pour lever l'ambiguïté, je vous suggère de dire des choses comme "type de paramètre du constructeur", "type constructeur membre", ou "constructeur de type alias", pour souligner que vous ne parlons pas seulement propre type.)
ps: Pour compliquer encore les choses, "polymorphe" est ambiguë d'une manière différente, depuis un type polymorphe signifie parfois universellement quantifiée type, tels que
Forall T, T => T
, ce qui est un bon type, car il classe les valeurs polymorphes (en Scala, cette valeur peut être écrite comme le type de structure{def apply[T](x: T): T = x}
)(Cette réponse est une tentative pour décorer Adriaan Maures répondre par quelques graphiques et de l'information historique.)
Plus kinded types font partie de la Scala depuis 2.5.
Avant que la Scala, Java jusqu'à maintenant,
n'autorise pas l'utilisation de type de constructeur
("génériques" en Java) pour être utilisé comme
paramètre de type d'un constructeur de type. par exemple,
n'était pas possible.
(Photo provenant de Les génériques d'un Genre Plus élevé)
La conséquence en est, que le constructeur de type (par exemple,
List
) pourrait être utilisétout comme d'autres types dans le type de paramètre de position de type constructeurs et ainsi de
ils sont devenus les premiers types de classe depuis Scala 2.5. (Similaires à des fonctions qui sont de première classe, les valeurs de la Scala).
Dans le contexte d'un type de système de soutien plus élevé sortes, nous pouvons
distinguer propre type, des types comme
Int
ouList[Int]
de premier ordre, des types commeList
et types d'un genre plus élevé commeFunctor
ouMonad
(types abstraits sur les types abstraits de plus de types).Le système de type de Java de l'autre côté ne prend pas en charge les types et par conséquent n'a pas de types
"d'un genre plus élevé".
Donc ce doit être considérée dans le contexte de l'appui type de système.
Dans le cas de la Scala, vous voyez souvent des exemples d'un type constructeur comme
avec le titre "Plus kinded types", par exemple dans Scala pour les programmeurs, la section 4.3
C'est parfois missleading, parce que beaucoup se réfèrent à
Container
comme plus kinded type et pasIterable
, mais ce qui est plus précis est,La genre de l'ordinaire des types comme
Int
etChar
, dont les instances sont des valeurs, est*
. Le genre de unaire type de constructeurs commeMaybe
est* -> *
; type binaire constructeurs commeEither
ont (au cari) type* -> * -> *
, et ainsi de suite. Vous pouvez afficher les types commeMaybe
etEither
type de fonctions: ils prennent un ou plusieurs types, et le retour d'un type.Une fonction est d'ordre supérieur si il a un ordre plus grand que 1, où l'ordre est (de manière informelle) la profondeur d'imbrication, de la gauche, de la fonction flèches:
1 :: Int
chr :: Int -> Char
fix :: (a -> a) -> a
,map :: (a -> b) -> [a] -> [b]
((A -> B) -> C) -> D
(((A -> B) -> C) -> D) -> E
Donc, longue histoire courte, un supérieur kinded type est juste un type de niveau de la fonction d'ordre supérieur.
Int :: *
Maybe :: * -> *
Functor :: (* -> *) -> Constraint
—plus-kinded: convertit unaire type des constructeurs pour typeclass contraintesFunctor
produit un type approprié (le bien, le trait, mais la même idée)Functor[F[_]]
à partir d'un constructeur de typeF
.(* => *) => (* => *)
être exprimé en Scala? Si non, dans une autre langue?* ⇒ * ⇒ *
avec nourrissage est très utile. Merci!(* ⇒ *) ⇒ (* ⇒ *)
peut également être orthographié(* ⇒ *) ⇒ * ⇒ *
. Il peut être exprimé en Scala commeFoo[F[_], T]
. Ce genre de type (en Haskell)newtype Twice f a = Twice (f (f a))
(par exemple,Twice Maybe Int
≅Maybe (Maybe Int)
,Twice [] Char
≅[[Char]]
) ou quelque chose de plus intéressant comme le free monadedata Free f a = Pure a | Free (f (Free f a))
.Je dirais: Une plus grande kinded type les résumés de plus de un constructeur de type. E. g. envisager
Ici
Functor
est un "plus kinded type" (comme utilisé dans les "Les génériques d'un Genre Plus élevé" papier). Ce n'est pas un béton ("premier ordre") type constructeur commeList
(qui ne tient pas plus de bon type seulement). Il les résumés sur tous les unaire ("premier ordre") type de constructeurs (comme indiqué parF[_]
).Ou pour le dire d'une autre manière: En Java, nous avons clairement le type de constructeurs (par exemple
List<T>
), mais nous n'avons pas de "plus kinded types", parce que nous ne pouvons pas abstraite au-dessus d'eux (par exemple, on ne peut pas écrire leFunctor
interface définie ci - dessus, du moins pas directement).Le terme "d'ordre supérieur (type constructeur) polymorphisme" est utilisé pour décrire les systèmes qui prennent en charge "de plus en plus kinded types".
List<T>
en Java serait un unaire constructeur de type, comme elle l'a clairement la nature* -> *
. Ce qu'il manque à Jon réponse est que vous devez être en mesure de résumé sur le "tout" (et pas seulement au cours de la deuxième*
comme en Java) pour appeler un supérieur kinded type.def succ(x: Int) = x+1
introduit le "constructeur" (voir mon autre réponse, pour ce que je veux dire par là)succ
(ne serait reportez-vous à cette valeur que succ(x: Int)). Par analogie,Functor
est en effet plus élevé kinded) type défini dans votre réponse. Encore une fois, vous ne devriez pas se référer à elle commeFunctor[F[_]]
(ce qui estF
? qu'est-ce que_
? ils ne sont pas dans la portée! malheureusement, le sucre syntaxique pour existentiels brouille les eaux ici en faisantF[_]
court pourF[T forSome {type T}]
)