10
votes

SCALA: preuves implicites pour la classe avec paramètre de type

Voici une installation simple avec deux traits, une classe avec un paramètre de type covariant délimitée par les traits précédents et une deuxième classe avec un paramètre de type délimité par l'autre classe. Pour les deux classes, une méthode particulière est disponible (via des preuves implicites) uniquement si l'un des deux traits sous-tend le paramètre de type. Cela compile bien: xxx

Cependant, car bar est covariant dans f , je ne devrais pas avoir besoin du f Paramètre dans Grill . Je devrais simplement exiger que B est un sous-type de bar [lisiblefoo] . Ceci, cependant, échoue: xxx

avec l'erreur: xxx

Pourquoi la preuve implicite n'est-elle pas prise en compte ?


0 commentaires

3 Réponses :


6
votes

L'appel bar.readfield est possible car l'instance de preuve <: << / code> permet une conversion implicite de B sur bar [ Lisiblefoo] .

Le problème, je pense que pour appeler readfield Vous avez besoin d'un paramètre de preuve successif F <: . Donc, mon devin est, le compilateur ne remplace pas complètement le paramètre de type de la barre dans le premier étage de recherche de la résolution implicite (car de trouver readfield , il faut juste bar en premier lieu). Et puis, il étouffe la deuxième résolution implicite, car il n'y a aucune forme de «retour en arrière» autant que je sache.

Quoi qu'il en soit. La bonne chose est que vous en savez plus que le compilateur et vous pouvez faire appel à la conversion explicitement, soit à l'aide de la méthode Appliquer de <: << / code> ou à l'aide de la méthode de l'aide. implicitement : xxx

Il existe une autre possibilité qui pourrait être la plus propre, car elle ne s'appuie pas sur la mise en œuvre de <: qui pourrait être un problème car @kaito suggère: xxx


5 commentaires

Je ne sais pas si <: <:


@Kaito: Avez-vous des preuves que <: << / code> 's appliquer n'est pas censé être appelé? C'est Comportement documenté . Vous pouvez écrire (barre: barre [lisiblefoo]). Lisezfield et laissez la conversion implicite au courant automatiquement, mais la version de Scis se sent propre pour moi.


@TravisBrown: aucun. Mais je ne trouve pas la ligne qui documente réellement verbalement le comportement de la fonction, juste l'explication héritée du trait de fonction abstraite1. Je conviens que c'est gentil mais je ne suis pas sûr que ce comportement puisse être invoqué, il pourrait aussi bien lancer une exception dans la prochaine version que je pense.


@Kaito: Il n'y a pas de traitement magique ou spécial dans <: << / code> par le compilateur. C'est une conversion implicite (et donc appliquer sera normalement appelée); Ce n'est pas une contradiction avec le fait qu'en raison de la covariance du type de retour de la fonction, elle agit en tant que fonction d'identité. Voir Le code source Sur la manière dont appliquer fonctionne, et plus important encore de savoir comment l'implicite est construit (méthode conforme ). Donc, vous avez raison, cela fait un typaste sûr, mais encore une fois, c'est exactement ce qui se passe implicitement.


@Sciss hm, je ne vois tout simplement pas les contraintes de type comme des conversions implicites, mais je suppose qu'il est logique qu'ils doivent être compatibles avec d'autres conversions puisqu'elles se trouvent également à la vue des limites de la vue.



7
votes

0 __ Réponse (Utilisez l'argument de la preuve implicite pour activer bar dans le type de droite) est la réponse que vous donnerais à la question spécifique que vous avez posée (bien que je suggère d'utiliser non l'utilisation de implicitement si vous avez l'argument implicite assis là-bas).

On vaut la peine de noter que la situation que vous décrivez des sons comme s'il s'agissait d'une bonne affaire pour le polymorphisme ad hoc via des classes de type, cependant . Dis par exemple que nous avons la configuration suivante: xxx

et une classe de type, ainsi que quelques méthodes de commodité pour créer de nouvelles instances et pour PIMPING A Readfield < / Code> Procédé sur n'importe quel type qui a une instance dans la portée: xxx

et quelques instances: xxx

Et enfin un FOO : xxx

Cela nous permet de faire ce qui suit, par exemple: xxx

ce que nous voulons.


0 commentaires

1
votes

Ce n'est pas une réponse à la question, mais de montrer que la "contrainte de type" n'est vraiment qu'une conversion implicite: xxx


1 commentaires

Je suis au courant de la façon dont ça fonctionne. La question que je demandais est simplement de savoir si c'est le comportement prévu et peut être invoqué dans les futures mises à jour. La documentation mentionne uniquement qu'elles sont des contraintes de type, pas leur utilisation comme des conversions implicites.