2011-05-20 9 views
6

si quiero definir un método de extensión para la matriz flotante como la desviación estándar, ¿sería mejor usar la extensión del módulo en el módulo Array o la extensión en el tipo float[]? gustan:Extensión del módulo F # frente a la extensión de tipo

module Array = 
    let std (arr: float[]) = ... 

o

type float ``[]`` with 
    member this.std = ... 

Si hago extensión de tipo como éste, sería la única std se calculará una vez o cada vez que se utiliza?

Y, ¿cuál es el formato correcto para este último, type float ``[]`` with no funciona ... gracias.

Respuesta

5

En este caso, no puede definir una extensión de tipo por lo que el problema es irrelevante: debe usar una extensión del módulo Array. La razón por la que no puede definir una extensión de tipo es que en F #, las extensiones de tipo deben reflejar exactamente las definiciones de tipo, por lo que puede definir una extensión de tipo genérico 'a list, por ejemplo, pero no en el tipo construido string list. Del mismo modo, se podría definir un método de extensión en el (simulado) genérica tipo de matriz

'a ``[]`` 

pero no en el tipo de matriz construida

float ``[]`` 

Este comportamiento es diferente de C#, donde es posible escribir métodos de extensión en tipos genéricos construidos.

+0

@kvb: ¿Sabes _por qué_ funcionan de manera diferente en F #? – Daniel

+0

@Daniel - Yo no. Sin embargo, creo que el comportamiento de F # tiene sentido. ¿Por qué no se deben escribir las definiciones de tipo espejo de extensiones? ¿No parece extraño que los métodos en una instancia de un tipo genérico construido dependan de sus argumentos de tipo? – kvb

+0

@kvb: Sí, pero parece tener mucho sentido en las interfaces genéricas. Por ejemplo, 'string Join (esta IEnumerable partes)' parece razonable. – Daniel

Cuestiones relacionadas