F# - 将简单的循环转换为更多功能构造

wkl*_*klm 3 .net f# functional-programming

我有这种简单的"投资"类型,具有"终身"属性:

type Investment = {
PurchasePayment: float;
Lifetime: float;
TaxWriteoff: float;
ResidualValue: float;
}

let CoffeMachine = {
    PurchasePayment = 13000.0;
    Lifetime = 4.0;
    TaxWriteoff = 2000.0;
    ResidualValue = 500.0;
}
Run Code Online (Sandbox Code Playgroud)

我想重复多年的投资并每年进行一些计算:

for i = 1 to int CoffeMachine.Lifetime do
    printf "%i" i
    // doSomething
Run Code Online (Sandbox Code Playgroud)

有没有办法避免使用for循环并以更实用的方式编写它?

干杯,

WOJTEK

Fyo*_*kin 6

调用对列表中的每个项执行计算的首选方法map.具体来说,对于您的情况,您可以创建从1到1的数字列表,Lifetime然后用于List.map对每个数字执行计算:

let calculation year = year * 2 // substitute your calculation here

let calcResults = [1..int CoffeMachine.Lifetime] |> List.map calculation
Run Code Online (Sandbox Code Playgroud)

也就是说,我认为你将"功能性"与"难以理解"(或许,"炫耀")混为一谈."函数式编程"的要点不是所有的数学,也不是无法接受的."函数式编程"的意思是"用函数编程".这有一些实际意义,例如"不可变数据"和"无副作用",只要您的程序满足这些要求,您就可以将其视为"功能性",无论它看起来多么简单.事实上,我认为它看起来越简单越好.软件可维护性是一个非常有价值的目标.

特别是,如果你只想打印多年,那么你的代码就可以了:打印出来就是一个"副作用",所以只要这是一个要求,就没有办法让它更"实用".但是如果你的目标是执行一些计算(如上面的例子中所示),那么可以用列表理解表达更清晰:

let calcResults = [for year in 1..int CoffeMachine.Lifetime -> calculation year]
Run Code Online (Sandbox Code Playgroud)