Question

J'ai écrit ce qui suit

[<Measure>]
type m

[<Measure>]
type s

[<Measure>]
type v = m/s

type Vector3<[<Measure>] 'a> =
    {
    X : float<'a>
    Y : float<'a>
    Z : float<'a>
    }
    static member (*)
        (v:Vector3<'a>,f:float<'b>):Vector3<'a*'b> =
        { X = v.X*f; Y = v.Y*f ; Z = v.Z * f}

Maintenant, je suis en train de l'utiliser de cette façon:

let next_pos (position:Vector3<m> , velocity: Vector3<m/s> ,dt : float<s>  ->  Vector3<m>) =
     position + (velocity * dt)

Il me donne une erreur de compilation, mais je suis sûr que l'unité de mesure sont exprimées à droite. Quel est mon erreur?

Était-ce utile?

La solution

La syntaxe que vous avez essayé d'utiliser pour spécifier le type de retour est incorrect. Il devrait ressembler à ceci:

let next_pos (position:Vector3<m>, velocity:Vector3<m/s>, dt:float<s>) : Vector3<m> = 
  position + (velocity * dt) 

Pour spécifier que la fonction retourne une valeur de type Vector3<m>, vous devez ajouter une annotation de type au résultat, ce qui se fait en écrivant let foo <arguments> : T = <expr>. Lors de l'ajout d'annotations de type aux paramètres, ceux-ci ont besoin d'être parenthésée (de sorte que la syntaxe est pas ambigu). Comme l'a noté Paolo dans un commentaire, votre utilisation de -> a dit que dt est une fonction, parce que l'annotation float<s> -> Vector3<m> a été attaché au paramètre dt.

Pour la compilation de code, je devais également ajouter une implémentation de l'opérateur de (+) à votre Vector3, mais je suppose que vous avez déjà (et juste laissé sur la question lors de la publication).

Autres conseils

Je résolus de cette façon (mais je ne suis pas sûr de la raison).

let next_pos (position:Vector3<m> , velocity: Vector3<m/s> ,dt : float<s> ) =
     position + (velocity * dt)

Il semble que le compilateur échoue si je définis explicetly le type de retour. Si je le supprimer semble pouvoir déduire le type correct de toute façon. Mais pourquoi cela?

En plus de cela, il y a des situations où des conflits de noms en vigueur de déclaration de type me spécifions explictely le type de retour. Je ne pense pas que ce soit la bonne solution à la fin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top