2012-03-28 17 views
9

Si uno usa el F # Interactivo Shell (FSI), el tipo de expresión inferida (signature) se imprime en la consola junto con su valor:¿Cómo generar la firma de tipo F # similar a FSI en mi propio código?

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

¿Cómo puedo imitar el mismo comportamiento en mi propio código, por ejemplo, para obtener los tipos inferidos como una cadena para una expresión F #?

No necesito evaluar dinámicamente ninguna expresión F #, las expresiones son conocidas en tiempo de compilación y son parte de mi código F # (estático). Necesito esta característica para poder imitar la salida de FSI en LINQPad para mis demos de F #.

+0

Si las expresiones son conocidos por delante de tiempo, por qué no ejecutar a través de FSI por delante de tiempo así? – pblasucci

+0

@pblasucci Utilizo LinqPAD para codificación en vivo y funciona perfectamente con F #. Cambiar a FSI cada vez que necesito mostrar una firma para una expresión sería perder demasiado tiempo. Pero lo tengo como una opción, ¡gracias! –

+0

@AlexanderGalkin ¿Puede LinqPAD ejecutar un comando de shell? Puede pagar y ejecutar el comando fsc con la bandera --sig y pasarle el archivo en el que está trabajando actualmente. –

Respuesta

10

Usando Unquote

Unquote tiene una facilidad para conseguir el F # firma de un tipo. Simplemente descargue la última versión y agregue una referencia a través de LINQPad a Unquote.dll, luego puede hacerlo, p.

enter image description here

Si está interesado, puede alcanzar su punto máximo en el código fuente de la aplicación de la extensión FSharpNameType: http://code.google.com/p/unquote/source/browse/tags/2.1.0/Unquote/ExtraReflection.fs#54.

Usando FsEye

Otro enfoque ordenada sería utilizar API beta Custom Visualizer de LINQPad para incrustar FsEye en LINQPad (FsEye utiliza el mismo algoritmo de impresión firma # tipo F como Unquote). Esto también es muy simple, todo lo que necesita hacer es descargar LINQPad beta, descargar y hacer referencia a FsEye.dll desde la última versión de FsEye, luego puede hacerlo, p.

enter image description here

+0

Me encanta ** los entornos que mezclan datos y metadatos. También los amaría directamente en Visual Studio, haciendo reemplazo de expresiones para obtener resultados concretos de las funciones que estamos escribiendo ... – nicolas

+0

¡Faltan imágenes!¡¡¡Muy frustrante!!! :-) –

+1

¿En lugar de descargar y ref a dll manualmente, ya que LinqPad beta admite paquetes nuget, tal vez un paquete nuget del dll FsEye? – jbtule

1

Si observa el código del compilador F # y ve cómo el compilador maneja la opción --sig, creo que obtendrá lo que está buscando. Más acerca de la opción --sig y firmas aquí:

Signatures (F#)

+0

Gracias por su sugerencia: agregué las firmas a mi pregunta. Tratar de profundizar en la implementación del compilador parece una exageración para mí, lo siento. –

+0

¿Por qué no usar la opción '--sig' y presentar el archivo de firma durante las demostraciones? –

+0

Pensé que estaba preguntando cómo hacer esto programáticamente. –

Cuestiones relacionadas