2011-09-20 18 views
22

Esta es la declaración típica de un miembro de resumen en F #:¿No hay nombres de argumento en la declaración de resumen?

abstract member createEmployee : string -> string -> Employee 

Se definen los tipos de argumentos, pero no sus nombres. Sin nombres, ¿cómo se puede saber qué es cada parámetro cuando se implementa la interfaz? En otras palabras, ¿cómo sabe si la interfaz espera implementarse como 1- o 2-?

1- member this.createEmployee firstName lastName = ... 
2- member this.createEmployee lastName firstName = ... 

¿Estoy buscando el problema desde una perspectiva equivocada (se usa para C#)?

Respuesta

34

¿Qué hay de:

abstract member createEmployee : firstName:string -> lastName:string -> Employee 

?

+3

Gracias, esto es embarazoso poco :-), nunca he visto antes params ejemplos con nombre en el documento en línea. –

+11

Lo que es interesante es que es un error envolver los pares de nombre y tipo de parámetro entre paréntesis como lo haría al especificar el tipo de parámetros de función como: 'miembro abstracto createEmpleo: (firstName: string) -> (lastName: string) - > Employee' – danielrbradley

5

La sintaxis para esto es IMO superflexible. Yo quería hacer esto con los parámetros como una tupla (como un método de C#) y sólo a través de ensayo y error qué encontré que esto funcione:

abstract member PutChar : x:int * y:int * c:char * flag:Background -> unit 

Y esta variante más feo también funciona:

abstract member PutChar : x : int * y : int * c : char * flag : Background -> unit 

a continuación se presentan las cosas que todos sentimos razonable, pero no pudo con el mismo error - Unexpected symbol ':' in member definition.:

// ALL BAD vvv 
    abstract member PutChar : (x:int * y:int * c:char * flag:Background) -> unit 
    abstract member PutChar : (x:int, y:int, c:char, flag:Background) -> unit 
    abstract member PutChar : (x:int) * (y:int) * (c:char) * (flag:Background) -> unit 
    // ALL BAD ^^^ 
+0

Sin los nombres de los parámetros, la primera variante no válida se compilaría a un método CLI que toma un argumento que resulta ser una tupla. Esa es una firma notablemente diferente a un método CLI de 4 argumentos; no puede nombrar los componentes de las tuplas que están anidados así. El segundo es sintácticamente inválido; la coma no se usa en los tipos de esta manera. No sé por qué el tercero no está permitido. – Vandroiy

Cuestiones relacionadas