我正在用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
所以我的问题是,是否可以重写代码,以便获得我想要的流程并避免在不分配变量的情况下声明变量?
答案 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读取)。