Как прочитать пользовательский ввод с помощью интерактивного f # в Visual Studio? - PullRequest
4 голосов
/ 05 ноября 2011

Итак, я пытаюсь сделать что-то простое:

 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 (выделение + alt + enter), он просто проходит прямо над входной частью, и исключение выдается (и перехватывается).*

Вот вывод, когда я запускаю в FSI (в visual studio):

Enter a number:
Invalid number!
0

Как видите, на самом деле он никогда не останавливается и не ждет, пока я введу ввод.

Кто-нибудь знает, как заставить это работать?

Спасибо!

Ответы [ 4 ]

8 голосов
/ 06 ноября 2011

Интерактивная консоль F # в Visual Studio не поддерживает чтение ввода, поэтому нет способа запросить ввод с консоли.Если вы выполняете код в интерактивном режиме, вы всегда можете ввести ввод в редакторе, поэтому лучшим решением будет иметь привязку 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 голосов
/ 22 марта 2018

В Visual Studio для Mac Community 7.4 (сборка 1033) я также столкнулся с этой проблемой при компиляции и запуске исходных файлов, а не сценариев.

Если я использую встроенную консоль (она отображается рядом сокно вывода), я не могу прочитать ввод с помощью System.Console.ReadLine ().

Когда я переключаюсь на внешнюю консоль, установив флажок «Запуск на внешней консоли» в конфигурации запуска по умолчанию (Проект -> Параметры -> Выполнить: Конфигурации: по умолчанию), я могу прочитать ввод.

0 голосов
/ 27 ноября 2017

Попробуйте ниже, он отлично работает на моей машине (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]
0 голосов
/ 06 ноября 2011

Если вы открываете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...