Cette fonction: produit une erreur p> Le type 'float <' u> 'n'a pas de sous-types appropriés et ne peut pas être utilisé comme source d'un test de type ou d'une coercition d'exécution. P>
blockQuote> Y a-t-il une façon de moquer des unités de mesure de mesure? p> p>
3 Réponses :
Il y a deux problèmes avec votre approche. Tout d'abord, lorsque vous utilisez un soulignement dans la définition de votre fonction, c'est la même chose que d'utiliser une variable de type fraîche, votre définition est donc équivalente à ce qui suit: Quel message d'erreur vous dit que le compilateur savait que Vous pouvez essayer de contourner cela par première boxe Afret, ce que vous essayez de faire semble être assez suspect - des fonctions qui sont des fonctions qui sont générique dans l'unité de mesure ne doit pas faire différentes choses en fonction de ce que le type de mesure est; ils devraient être correctement paramétriques. Qu'est-ce que vous essayez exactement d'atteindre? Cela ne ressemble certainement à une opération correspondant à la réalité physique, qui constitue la base des types de mesure de F #. P> p> v code> est de type
float <'u> code> et
float <' u> code> n'a pas de sous-types appropriés , il ne sert donc pas à faire un test de type pour déterminer s'il s'agit d'un
float
V code> dans un objet, puis effectuez un test de type. Cela fonctionnerait, par exemple, si vous aviez une liste
<'a> code> et voulait voir s'il s'agissait d'une liste
CODE> - Système de F # pour les unités de mesure est en fait assez similaire à cet égard à la manière dont Java gère des types génériques génériques. P>
Salut, merci pour la réponse. Je devrai repenser mon code une fois de plus. Un commentaire: Pourquoi une valeur avec des unités
@Oldrich - ce n'est pas clair pour moi pourquoi ce n'est pas simplifié (ma lecture de la spécification indique qu'il devrait être), mais f # est conscient que ces mesures sont équivalentes (par exemple, vous pouvez écrire let (x: float <1 / s>) = 1.0
comme @kvb em> explique en détail, le problème est que les unités de mesure font partie du type. Cela signifie que Donc, vous essayez réellement d'écrire une fonction qui fonctionnerait avec deux types d'entrée différents. La solution fonctionnelle propre consiste à déclarer une union discriminée pouvant contenir des valeurs du premier type ou du second type: p> alors vous pouvez écrire la fonction à l'aide de la correspondance de modèle ordinaire: p> Vous devrez expliquer explicitement les valeurs dans la valeur de l'Union discriminée, mais c'est probablement le seul moyen de le faire directement (sans apporter de plus gros changements dans la structure du programme. ). p> pour des types normaux tels que float
float s> code> (et malheureusement, ces informations ne sont pas stockées dans le cadre de la valeur au moment de l'exécution).
int code> et
float code>, vous pouvez également utiliser des membres surchargés (déclarés dans certains types F #), mais ça ne Travaillez pour des parts de mesure, car la signature sera la même après que le compilateur F # efface les informations de l'unité. P> p>
Voir les unités à l'exécution em> section de http: //msdn.microsoft.com/en-us/library/dd233243.commexe . Je suis d'accord avec @kvb, je pense que le meilleur moyen de contourner est de passer un objet. P> Ce que je voudrais faire, en utilisant votre structure de code: p>