2010-11-10 8 views
6

Supongamos que he definido una unidad de medida:¿Por qué no puedo pasar argumentos con unidades a tipos F #?

[<Measure>] type Blob

Y quiero un tipo que tiene un valor en gotas por segundo como un argumento del constructor:

type Something(flowRate:double<Blob/s>) = ...

F # lanza una tambaleante en esto - "doble no espera ningún tipo de argumentos, pero aquí se da 1 tipo de argumento"

Entiendo el mensaje. Hubiera pensado que era obvio lo que estaba tratando de hacer, aunque reconozco que la sintaxis probablemente sea verificable incorrecta. La pregunta es, ¿cómo expreso esta relación en el código?

Respuesta

8

Como indica el mensaje (tipo de), los dobles no son genéricos de medida. Pruebe float<Blob/s> en su lugar. Es un poco extraño, ya que float es un sinónimo de tipo para el tipo double. Sin embargo, tipo float<[<Measure>]'t> es de alguna manera su propio tipo separado. Se produce un problema similar con single frente a float32, int32 frente a int y int8 frente a byte. Section 9.7 of the spec cubre en parte esta información.

Es especialmente confuso ya que no puede definir sus propios tipos que se diferencian sólo en su aridad medida:

type T = class end 
type T<[<Measure>]'t> = class end //' Duplicate definition of type T 
+0

brillante, gracias. Supuse que el compilador intentaba decirme que "las declaraciones de tipo de argumento no toman unidades", es decir, las unidades van al final de los literales, en lugar de ser tipos. Esto lo hace más simple. –

Cuestiones relacionadas