type NewType = string * int
est ce qu'on appelle une abréviation de type. Il donne un nom ou un alias à un autre type, mais il est effacé lors de la compilation. Il n'y a pas d'encapsulation, pas de nouvelle référence et fondamentalement pas de nouveau type du tout.
Il peut servir de documentation, mais le compilateur F # traite le nouveau nom et le type d'alias de la même manière. Ceci est particulièrement visible si vous créez une DLL avec une fonction/méthode publique qui utilise NewType
et essayez de l'appeler à partir d'un autre projet - vous verrez des résultats mixtes comme dans votre cas.
Ceci peut ne pas poser de problème si ce que vous voulez réaliser est juste une meilleure lisibilité. Si je vois let testFunction (arg1:NewType) : NewType = ...
dans le code, surtout sur le web comme sur GitHub, où il n'y a pas d'info-bulles IntelliSense, cela me donne une bonne idée de ce que la fonction prend et retourne, même si le vrai type est string * int
.
Si vous voulez une meilleure sécurité de type, la pratique habituelle consiste à définir un seul cas de discrimination syndicale que vous pouvez combiner avec un motif correspondant à ceci:
type NewType = NewType of (string * int)
let testFunction (NewType arg1): NewType =
NewType ("resultString", 2)
testFunction (NewType ("test", 3))
Vous pouvez en lire plus ici, et dans d'autres articles de la série: https://fsharpforfunandprofit.com/posts/type-abbreviations/
Mais pourquoi le type de retour est "NewType", pourquoi fonctionne-t-il avec le type de retour et non avec l'argument. Au fait, merci pour le lien! – FraK
@FraK, c'est une bonne question, à laquelle je ne connais pas de réponse satisfaisante autre que: c'est ainsi que la version actuelle du compilateur a décidé de le faire (source par exemple: https://github.com/fsharp/fsharp/issues/717). Comme Tomas le dit gentiment, le type original et son alias sont interchangeables pour le compilateur (et d'autres outils), et il ne donne aucune garantie quant à quand vous verrez l'un ou l'autre. –
Merci pour la réponse – FraK