Pregunta

He escrito lo siguiente

[<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}

Ahora estoy tratando de usarlo de esta manera:

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

Me da un error del compilador, pero estoy bastante seguro de que la unidad de medida se expresa correctamente. ¿Cuál es mi error?

¿Fue útil?

Solución

La sintaxis que intentó usar para especificar el tipo de retorno era incorrecta. Debe tener un aspecto como este:

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

Para especificar que la función devuelve un valor de tipo Vector3<m>, debe agregar una anotación de tipo al resultado, que se realiza escribiendo let foo <arguments> : T = <expr>. Al agregar anotaciones de tipo a los parámetros, estos deben ser parentizados (por lo que la sintaxis no es ambigua). Como señaló Paolo en un comentario, su uso de -> estaba diciendo que dt es una función, porque la anotación float<s> -> Vector3<m> se unió al parámetro dt.

Para hacer que el código se compile, también tuve que agregar una implementación de (+) operador de tu Vector3, pero supongo que ya lo tienes (y solo lo dejó al publicar la pregunta).

Otros consejos

Resolví de esta manera (pero no estoy seguro de la razón).

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

Parece que el compilador falla si defino explicetamente el tipo de retorno. Si lo elimino, parece poder inferir el tipo correcto de todos modos. ¿Pero por qué esto?

Además de eso, hay situaciones en las que los enfrentamientos de nombres en la declaración de tipo me obligan a especificar explictamente el tipo de retorno. Así que no creo que esta sea la solución correcta al final.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top