2012-03-28 14 views
9

Se si usa il F # Interactive Shell (FSI), il tipo di espressione dedotto (signature) viene stampato alla console insieme con il suo valore:Come generare la firma di tipo F # simile a FSI nel mio codice?

val it : int * string * float = (42, "Hello F#", 42.0) 

Come posso mimare lo stesso comportamento nel mio codice, ad esempio, ottenere i tipi dedotti come stringa per un'espressione F #?

Non ho bisogno di valutare in modo dinamico qualsiasi # espressioni F, le espressioni sono noti in fase di compilazione e sono parte del mio codice F (statica) #. Ho bisogno di questa funzionalità per poter simulare l'output FSI in LINQPad per le mie demo F #.

+0

Se le espressioni sono noti ahead-of-time, perché non farli passare attraverso FSI ahead-of-time come bene? – pblasucci

+0

@pblasucci Io uso LinqPAD per la codifica live e funziona perfettamente con F #. Passare a FSI ogni volta che ho bisogno di mostrare una firma per un'espressione sarebbe troppo tempo sprecato. Ma lo tengo come opzione, grazie! –

+0

@AlexanderGalkin LinqPAD può eseguire un comando shell? È possibile eseguire il shell out ed eseguire il comando fsc con il flag --sig e passarlo sul file su cui si sta lavorando. –

risposta

10

Utilizzando Unquote

Unquote ha una funzione per ottenere la F # firma di un tipo. È sufficiente scaricare l'ultima versione e aggiungere un riferimento tramite LINQPad a Unquote.dll, quindi è possibile farlo ad es.

enter image description here

Se siete interessati, potete picco al codice sorgente per l'attuazione dell'estensione FSharpNameType: http://code.google.com/p/unquote/source/browse/tags/2.1.0/Unquote/ExtraReflection.fs#54.

Utilizzando FsEye

Un altro approccio pulito sarebbe quella di utilizzare di LINQPad beta Custom Visualizer API per incorporare FsEye in LINQPad (FsEye utilizza lo stesso # tipo di algoritmo stampa firma F come Fine della citazione). Anche questo è molto semplice, tutto ciò che devi fare è scaricare LINQPad beta, scaricare e consultare FsEye.dll dall'ultima versione di FsEye, quindi puoi farlo ad es.

enter image description here

+0

I ** love ** quegli ambienti che mescolano dati e metadati. Li adorerei allo stesso modo all'interno dello studio visivo, facendo sostituire le espressioni per ottenere risultati concreti delle funzioni che stiamo scrivendo ... – nicolas

+0

Immagini mancanti!Così frustrante!!! :-) –

+1

Invece di scaricare e ref manualmente una dll, dato che LinqPad beta supporta i pacchetti nuget, forse un pacchetto nuget della dll FsEye? – jbtule

1

Se si guarda il codice # compilatore F e vedere come l'opzione --sig viene gestito dal compilatore penso che si ottiene ciò che si sta cercando. Di più su l'opzione --sig e le firme qui:

Signatures (F#)

+0

Grazie per il tuo suggerimento - Ho aggiunto le firme alla mia domanda. Cercare di approfondire l'implementazione del compilatore mi sembra eccessivo, mi dispiace. –

+0

Perché non usare semplicemente l'opzione '--sig' e presentare il file della firma durante le dimostrazioni? –

+0

Ho pensato che stava chiedendo come farlo a livello di programmazione. –