在不指定变通方法的情况下声明变量

时间:2018-02-13 13:43:48

标签: f# functional-programming

我正在用F#编写一个小型控制台应用程序。

    [<EntryPoint>]
let main argv = 
    high_lvl_funcs.print_opt
    let opt = Console.ReadLine()
    match opt with
    | "0" -> printfn "%A" (high_lvl_funcs.calculate_NDL)
    | "1" -> printfn ("not implemented yet")
    | _ -> printfn "%A is not an option" opt 

来自module high_lvl_funcs

let print_opt = 
    let options = [|"NDL"; "Deco"|]
    printfn "Enter the number of the option you want"
    Array.iteri (fun i x -> printfn "%A: %A" i x) options

let calculate_NDL =
    printfn ("enter Depth in m")
    let depth = lfuncs.m_to_absolute(float (Console.ReadLine()))
    printfn ("enter amount of N2 in gas (assuming o2 is the rest)")
    let fn2 = float (Console.ReadLine())
    let table = lfuncs.read_table
    let tissue = lfuncs.create_initialise_Tissues ATM WATERVAPOUR
    lfuncs.calc_NDL depth fn2 table lfuncs.loading_constantpressure tissue 0.0

lfuncs.calc_NDL returns a float

这会产生这个

Enter the number of the option you want
0: "NDL"
1: "Deco"
enter Depth in m 

这意味着它打印出它想要的内容,然后直接跳到high_lvl_funcs.calculate_NDL

我希望它能够产生

  Enter the number of the option you want
    0: "NDL"
    1: "Deco"

然后让我们假设输入0,然后计算high_lvl_funcs.calculate_NDL

经过一番思考和搜索后,我认为这是因为F#想要在开始休息之前分配所有值。然后我认为我需要声明一个变量而不分配它。但人们似乎都认为这在函数式编程中很糟糕。来自另一个问题:Declaring a variable without assigning

所以我的问题是,是否可以重写代码,以便获得我想要的流程并避免在不分配变量的情况下声明变量?

1 个答案:

答案 0 :(得分:5)

您可以通过使calculate_NDL一个没有参数的函数而不是一个评估为float的闭包来解决这个问题:

let calculate_NDL () =

然后将其称为match中的函数,如下所示:

match opt with
| "0" -> printfn "%A" (high_lvl_funcs.calculate_NDL())

但是我建议重构这段代码,以便calculate_NDL将任何必要的输入作为参数而不是从控制台读取它们,即分别从控制台读取输入并将它们传递给calculate_NDL。 / p>

let calculate_NDL depth fn2 =
    let absDepth = lfuncs.m_to_absolute(depth)
    let table = lfuncs.read_table
    let tissue = lfuncs.create_initialise_Tissues ATM WATERVAPOUR
    lfuncs.calc_NDL absDepth fn2 table lfuncs.loading_constantpressure tissue 0.0

通常最好编写尽可能多的代码pure functions,而不依赖于I / O(比如从stdin读取)。