F # не возвращается в конце выражения - PullRequest
1 голос
/ 14 октября 2019

У меня проблема с тем, что программа F # не возвращается в конце выражения и завершает выполнение следующего выражения под ним.

Два выражения, как они появляются в файле:

   let startCycle = 
        printfn "startCycle"
        (0, "")


   let blah = 
        printfn "blah"
        (0, "")

И когда вызывается startCycle, он выводит оба сообщения на консоль. Пройдя через это с помощью отладчика, он переходит от первого (0, "") к printfn "blah" и возвращается при достижении второго (0,""). Я несколько раз проверял интервал, и Visual Studio распознает их как два отдельных выражения.

Еще одна странная вещь - если я вызываю startCycle несколько раз, он печатается только при первом запуске, после каждого вызова ничего не выводится на консоль, если я не остановлю и не перезапущу приложение. Я использую F # 4.7 с .NET Core 3. Чего мне не хватает?

РЕДАКТИРОВАТЬ: Если это помогает, вот как называется startCycle:

    let Run (cmdline: string) : (int * string) =
        let cmodel = parseCmd cmdline
        printfn "%A" cmodel
        match cmodel.Command with
        | "sendMsg4" -> Commands.sendMsg4 cmodel.Args
        | "sendMsg7" -> Commands.sendMsg7 cmodel.Args
        | "sendMsg8" -> Commands.sendMsg8 cmodel.Args
        | "sendMsg10" -> Commands.sendMsg10 cmodel.Args
        | "sendMsg16" -> Commands.sendMsg16 cmodel.Args
        | "sendMsg19" -> Commands.sendMsg19 cmodel.Args
        | "sendMsg22" -> Commands.sendMsg22 cmodel.Args
        | "sendMsg29" -> Commands.sendMsg29 cmodel.Args
        | "sendMixMessages1929" -> Commands.sendMixMessages1929
        | "help" | "Help" -> Commands.help cmodel.Args
        | "startCycle" -> Commands.startCycle
        | "stopCycle" -> Commands.stopCycle
        | "cycleStatus" -> Commands.cycleStatus
        | "set" -> Commands.setStateValue cmodel.Args
        | "show" -> Commands.show cmodel.Args
        | "" -> (1, "")
        | _ -> (-1, "Unknown Command")

1 Ответ

3 голосов
/ 14 октября 2019

startCycle и blah написаны не как функции, а как простые значения. Ключевое слово let в F # используется для обоих. Не волнуйтесь, это очень распространенный источник путаницы для людей, плохо знакомых с языком.

Чтобы создать функцию, которая не принимает никаких параметров, вам нужно ввести в "фиктивный" параметр unit, которыйзаписывается как ():

let startCycle () =
    printfn "startCycle"
    (0, "")

Это тогда называется так: Commands.startCycle ()

...