9
votes

Comment obtenir le type comme une chaîne de haskell?

Disons que j'ai un type mytype défini dans le module my.Module. Je veux avoir la chaîne "my.module.mype" (ou quelque chose comme ça). Si je viens de taper la chaîne directement, je pourrais avoir une faute de frappe, et si le module ou le nom de type change, j'aimerais savoir à l'heure de la compilation.

ah, il semble y avoir une confusion sur ce que je demande . S'il vous plaît regarder attentivement la question. Compte tenu du code: xxx

la sortie que je veux est: xxx

Je cherche le nom de type, non la définition de type. typeof produirait la sortie int et telle, ce n'est pas ce que je veux.


2 commentaires

Que voulez-vous utiliser cette chaîne? Votre programme devrait vous donner des erreurs compiler si vous utilisez le nom de type incorrect dans votre code.


Je veux une chaîne de nom de type, pas le type lui-même. Il est utilisé pour afficher le nom de type et l'utiliser pour correspondre à des noms de type UP etc.


4 Réponses :


0
votes

standard Haskell ne prend pas en charge cela pour les noms de type; Seulement pour les noms de foncteurs avec dérivant montrent . Vous pourrez peut-être obtenir des noms de type comme des chaînes à l'aide de Modèle HASKELL .


1 commentaires

Oui, je suppose que ce modèle Haskell peut être nécessaire.



10
votes

En résumé, la réponse consiste à activer le modèle HASKELL et à utiliser ' et ' '' xxx


si votre type dérive typable (que GHC peut faire automatiquement), vous pouvez simplement appeler typeof à partir de data.typeable pour obtenir une représentation montroyable.

Si vous souhaitez obtenir des types de certaines fonctions polymorphes, le paquet polytypeable sur Hackage vous permet de le faire: http://hackage.hakell.org/packages/archive/polytypeable/0.1.0.0/doc/html/data-polytypeable.html

Il s'agit d'une sorte de chose de type de type insane écrit par Oleg et emballé par Lennart, pensez-vous. Et il a .. des bizarreries. Le plus criant est que cela ne peut pas vous donner (ni imaginer comment quelque chose pourrait, franchement) des contextes de contrainte de classe. Donc, le spectacle recevra un type de A -> chaîne plutôt que Forall a. Afficher A => A -> String .

Si vous en avez besoin de plus que cela, et êtes satisfait de faire certaines choses uniquement à la compilation, puis utilisez le modèle HASKELL pour extraire des informations de type directement à partir de GHC. est le seul moyen d'aller. Voir réifier et info en particulier: http://hakage.hakell.org/packages/archive/template-haskell/2.5.0.0/doc/html/language-hakell-th.html < / a>


4 commentaires

Section 7.5.3 du manuel GHC Documents this: haskell.org/ghc/docs/latest/html/users_guide/...


@taotree. Quelle est la chaîne de type d'un type polymorphe? Voulez-vous dire par rapport aux signatures de fonction de Vis? Donc, vous pouvez obtenir dactyestr id = a -> A ?


Je m'excuse pour la confusion. J'ai essayé de réitérer la question de souligner ce que j'essaie d'obtenir. typeof n'est pas ce que je veux. Je veux le nom pleinement qualifié, pas la définition de type.


Ok, la réinciation m'a emmené pour nom qui m'a pris à ', ce dont j'avais besoin.



2
votes

Vous ne pouvez pas définir themagique en fonction (puisqu'il aurait besoin d'un argument de type), mais vous pouvez vous rapprocher.

import Data.Typeable
...
putStrLn $ show $ typeOf (undefined :: MyType)


0 commentaires

2
votes

Vous pouvez utiliser un proxy pour ceci: xxx


0 commentaires