2011-08-25 17 views
7

Diciamo che ho una funzione che fa qualcosa di abbastanza complicato e che è implementata con l'aiuto di sottofunzioni. Per semplificare le cose, invece di tuple mi piacerebbe utilizzare alcune strutture intermedie che sono private per l'implementazione di questa funzione.È possibile dichiarare un tipo nell'ambito della funzione in F #?

Non voglio che la dichiarazione di queste strutture fuoriescano. Quindi voglio qualcosa di simile:

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

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

    ... 

Ho provato, ma ovviamente il compilatore non mi permette di fare questo. Ho esaminato la documentazione e non vedo da nessuna parte che i tipi debbano essere dichiarati a livello di modulo.

in Lisp, per esempio, sembra che è tutto completamente legale, per es .:

(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)))) 

Così, mi sto perdendo qualcosa? Questo è possibile se F # a tutti?

+0

forse le funzioni sono di prima classe ma le classi non lo sono;) ... no è davvero strano - perché non compilare una cosa del genere in una classe anonima? Ma la soluzione è abbastanza facile come ha scritto Komrade P. Penso che se la tua funzione è così lunga che devi dare i tipi interni allora forse dovresti pensare ad alcuni refactoring in ogni caso – Carsten

risposta

5

Per verificare che questo non è consentito in base alle specifiche, date un'occhiata alla grammatica della F # espressioni nella specifica: Section 6: Expressions. Elenca vari costrutti che possono essere utilizzati al posto di expr e nessuno di essi è una dichiarazione di tipo type-defn (descritta in Section 8: Type Declarations).

La sintassi (semplificata) per le dichiarazioni di funzione è let ident args = expr, quindi il corpo deve essere un'espressione (e non è possibile dichiarare tipi all'interno di espressioni).

1

I tipi possono essere dichiarati solo nell'ambito del modulo o dello spazio dei nomi in F #.

(si può usare come modificatori di accesso internal o firma file per nascondere i tipi di altri componenti.)

+0

Dove esattamente nella documentazione lo dice? Non riuscivo a trovarlo. Link per favore? –

+2

Se si desidera "prova", è possibile consultare le specifiche della lingua. Inoltre, se si crea un modulo solo per queste funzioni, sarebbe meglio contrassegnare i tipi come privati ​​e non come interni. Privato significa solo in quel modulo specifico, interno significa solo in quello specifico "progetto" (o assemblaggio). –

Problemi correlati