2011-08-25 6 views
7

Digamos que tengo una función que hace algo bastante complicado y se implementa con la ayuda de subfunciones. Para facilitar las cosas, en lugar de tuplas me gustaría utilizar algunas estructuras intermedias que son privadas para la implementación de esta función.¿Es posible declarar un tipo en el alcance de la función en F #?

No quiero que la declaración de estas estructuras se filtre afuera. Así que quiero algo como esto:

let someComplexFun p = 
    type SomeRecord  = {i:int; x:int; y:int;} 
    type SomeOtherRecord = {...} 

    let innerFunctionA (x:SomeRecord) = ... 
    let innerFunctionB (x:SomeOtherRecord) = ... 

    ... 

lo intenté, pero, por supuesto, el compilador no vamos a hacer esto. Miré la documentación y no puedo ver en ningún lugar rápidamente que los tipos deben declararse a nivel de módulo.

En LISP, por ejemplo, parece que todo es completamente legal, por ejemplo .:

(defun foo (when) 
    (declare (type (member :now :later) when)) ; Type declaration is illustrative and in this case optional. 
    (ecase when 
     (:now (something)) 
     (:later (something-else)))) 

Por lo tanto, me estoy perdiendo algo? ¿Es esto posible si F # en absoluto?

+0

tal vez las funciones son de primera clase pero las clases no son;) ... no, es realmente extraño, ¿por qué no compilar tal cosa en una clase anónima? Pero la solución es bastante fácil ya que Komrade P. escribió. Creo que si tu función es tan larga que necesitas dar tipos internos, entonces tal vez deberías pensar en refactorizar de todos modos – Carsten

Respuesta

5

Para comprobar que esto no está permitido de acuerdo con la especificación, echar un vistazo a la gramática de F # expresiones en la especificación: Section 6: Expressions. Enumera varias construcciones que se pueden usar en lugar de expr y ninguna de ellas es una declaración de tipo type-defn (descrita en Section 8: Type Declarations).

La sintaxis (simplificada) para declaraciones de funciones es let ident args = expr, por lo que el cuerpo tiene que ser una expresión (y no se pueden declarar tipos dentro de expresiones).

1

Los tipos solo se pueden declarar en el alcance del módulo o espacio de nombres en F #.

(se puede utilizar como modificadores de acceso internal o archivos de firma para ocultar tipos de otros componentes.)

+0

¿Dónde exactamente en la documentación dice eso? No pude encontrarlo ¿Enlace por favor? –

+2

Si desea "prueba", puede consultar las especificaciones del idioma. Además, si crea un módulo solo para estas funciones, sería mejor marcar los tipos como privados y no como internos. Privado significa solo en ese módulo específico, interno significa solo en ese "proyecto" específico (o asamblea). –

Cuestiones relacionadas