2009-06-04 25 views

Respuesta

25

Si utiliza

let s = Console.ReadLine 

sólo se está construyendo un delegado que apunta a la función ReadLine. Necesita decir

let s = Console.ReadLine() 

para ejecutar realmente la función. Esto es exactamente como la sintaxis de C#, excepto que la inferencia de tipo significa que no obtienes una advertencia de compilación.

+2

Sí. Console.ReadLine es un valor "unit -> string". Al agregar el(), está pasando la 'unidad' que espera como argumento. – YotaXP

+0

+1 - Este comportamiento podría hacerse más claro al requerir un espacio delante del(), al igual que cualquier otro argumento para una función. –

+2

¡Tendría una advertencia del compilador! Cuando usas ** s **. Parece que quisiste escribir 'Console.ReadLine() |> ignore'. Yo argumentaría que es C# que no verifica si la salida de una función es capturada o ignorada. –

8

¿Qué quiere decir con "no está siendo honrado"? He aquí una pequeña aplicación de consola que acabo de escribir en VS2010b1, y funciona bien:

open System 

let line = Console.ReadLine() 
Console.WriteLine("You wrote {0}", line) 

// Just to make it pause 
let unused = Console.ReadLine() 

¿Estás tratando de ejecutar el código de C# interactivo dentro de Visual Studio? Si es así, ese puede ser el problema, como explica la publicación de Brian.

Sin embargo, no he visto el mismo problema al utilizar F # Interactive desde la línea de comandos. He aquí una transcripción completa de la sesión:

Microsoft F# Interactive, (c) Microsoft Corporation, All Rights Reserved 
F# Version 1.9.6.16, compiling for .NET Framework Version v4.0.20506 

Please send bug reports to [email protected] 
For help type #help;; 

> open System;; 
> let line = Console.ReadLine();; 
Hello world 

val line : string = "Hello world" 

Ejecución de código de bucle de Brian de F # Interactivo no mostraron el mismo problema.

Conclusión: Parece que está roto en F # Interactive en Visual Studio, pero no cuando se ejecuta de forma interactiva desde la línea de comandos o en una aplicación de consola completa.

+0

No lo estoy usando en modo interactivo. Solo estoy construyendo pequeñas aplicaciones de consola. –

+0

Hmmm ... eso es extraño. ¿Esto es con la versión instalada con VS2010b1? –

+0

Extraño. Ayer no pude hacer que funcionara, sin importar lo que intenté. Ahora no puedo hacer que falle, de nuevo sin importar lo que intento. –

3

No tengo una caja Beta1 a mano, pero sé que en el pasado tuvimos un error donde ReadLine() vería los comandos de fondo que se comunican entre la interfaz de usuario interactiva y el proceso en segundo plano que ejecuta su F # código. Puede ser interesante investigar qué

let Foo max = 
    let rec Loop i = 
     if i < max then 
      let line = System.Console.ReadLine() 
      printfn "line = %s" line 
      Loop (i+1) 
    Loop 1 

Foo 12 

se imprime cuando lo resalta y 'Enviar a interactivo'. Creo que posiblemente verá algunas líneas inesperadas e interesantes, seguidas de líneas que escriba en la ventana.

+1

Sí, parece que podría ser el problema: cuando intento eso en la versión beta 1, la primera línea escrita es solo "line =" –

+0

La diferencia es que está poniendo parens vacíos al final de la llamada ReadLine y yo no fue –

Cuestiones relacionadas