2011-11-05 86 views
3

所以我試圖做一些簡單:如何在visual studio中使用f#交互式讀取用戶輸入?

printfn "Enter a number:" 
    try 
     let x = System.Console.ReadLine(); 
     Some(int32(x)) 
    with 
     | :? System.FormatException -> printfn "Invalid number!" 
             Some(0) 

我想打印的信息,然後獲取用戶輸入一個數字,並嘗試將其轉換爲int並返回它。

如果我只編譯代碼(通過在命令行鍵入fsc a3.fs),它可以正常工作。它暫停,等待輸入,然後返回Some(int)。

如果我將代碼複製並粘貼到命令行中的FSI上,它的效果很好。

但是,當我在Visual Studio中,並且我在FSI中運行代碼(highlight + alt + enter)時,它只是在輸入部分上移動並引發異常(並被捕獲)。

下面是輸出的時候我在FSI運行(在Visual Studio):

Enter a number: 
Invalid number! 
0 

正如你所看到的,它沒有以往任何時候都實際上暫停並等待我進入輸入。

任何人都知道如何使這項工作?

謝謝!

+0

我說爲什麼不持有控制檯進行評估腳本。 – BLUEPIXY

回答

7

Visual Studio中的F#交互式控制檯不支持讀取輸入,因此無法從控制檯請求輸入。如果您以交互方式運行代碼,則始終可以在編輯器中輸入輸入,所以最好的解決方法是在運行代碼之前在輸入輸入的開始處綁定let。您可以使用#if支持兩個場景:

#if INTERACTIVE 
// TODO: Enter input here when running in F# Interactive 
let input = "42" 
#endif 

try 
    #if INTERACTIVE 
    Some(int32 input) 
    #else 
    let x = System.Console.ReadLine(); 
    Some(int32(x)) 
    #endif 
with 
    | :? System.FormatException -> 
     printfn "Invalid number!" 
     Some(0) 
+0

它更多的只是測試目的,我很好奇爲什麼它不工作。我會在下一部分記住這一點,儘管:)謝謝! – Toadums

+2

「The F#** Interactive ** console ...」和「...不支持閱讀輸入...」只是太多了:D – Noein

0

如果打開F#互動作爲它自己的進程(通過直接運行fsi.exe,代碼工作正常 - 這裏是發生在我身上:

> printfn "Enter a number:" 
- let r = 
-  try 
-  let x = System.Console.ReadLine(); 
-  Some(int32(x)) 
-  with 
-  | :? System.FormatException -> printfn "Invalid number!" 
-          Some(0) 
- ;; 
Enter a number: 
5 

val r : int32 option = Some 5 
+1

OP在原始問題中直接記錄的內容 - 「* If我將這些代碼複製並粘貼到FSI的命令行上,效果很好。*「 – ildjarn

0

嘗試下面,它工作正常在我的機器上(VS 2013,F#3.1 12.0.21005.1)

let inputTest i = 
    printfn "iter - %d" i 
    let input = System.Console.ReadLine() 
    printfn "%s" input 
    System.Console.ReadLine() |> ignore 

List.iter inputTest [1..3] 
相關問題