如何创建函数集合?

时间:2016-01-20 21:23:51

标签: design-patterns f# functional-programming currying

我只想说“usd_to_euro 100”并为我的特定日期取回正确的欧元金额(例如:90)。 create_exchange_functions需要返回什么?

let create_exchange_functions (usd_to_euro_rate, usd_to_yuan_rate, usd_to_peso_rate, usd_to_pound_rate, usd_to_ruble_rate) = 
    (??, ??, ??, ....??);

//在第x天的早晨我运行:

let (usd_to_euro, usd_to_yuan, usd_to_peso, usd_to_pound, usd_to_ruble) = create_exchange_functions(0.9, 4., 3., 0.6, 5.);
usd_to_pound 10.;

//在第二天早上我跑这个:

let (usd_to_euro, usd_to_yuan, usd_to_peso, usd_to_pound, usd_to_ruble) = create_exchange_functions(0.92, 3.8, 3., 0.65, 5.);
usd_to_pound 10.;

//在第二天早上z我运行:

let (usd_to_euro, usd_to_yuan, usd_to_peso, usd_to_pound, usd_to_ruble) = create_exchange_functions(0.92, 3.8, 3., 0.62, 5.);
usd_to_pound 10.;

1 个答案:

答案 0 :(得分:3)

鉴于

let create_exchange_functions (usd_to_euro_rate, usd_to_yuan_rate, usd_to_peso_rate, usd_to_pound_rate, usd_to_ruble_rate) = 
(??, ??, ??, ....??);

如何使这项工作。

让我们先让一个项目更简单,然后我们将完成所有这些。

let create_exchange_functions usd_to_euro_rate = 
    let toEuro dollar = usd_to_euro_rate * dollar
    toEuro

理解你想要的东西的关键是你需要一个函数来返回一个取curried值的新函数。特别是对于此示例,curried参数是函数需要的参数,但在创建函数时不会给出。

要查看此内容,请将类型添加到create_exchange_functions

let create_exchange_functions (usd_to_euro_rate : float) : (float -> float) = 
    let toEuro dollar = usd_to_euro_rate * dollar
   toEuro

我们看到create_exchange_functions接受了值usd_to_euro_rate并返回了我们想要的函数(float -> float)

但请注意,当我们创建函数toEuro时,我们只给它usd_to_euro_rate的值,而不是dollar的值。这就是currying正在做的事情。它允许我们创建需要参数的函数,后者可以提供参数。所以让我们看看这是如何完成的。

Fist使用usd_to_eruo

创建函数create_exchange_functions
let usd_to_euro = create_exchange_functions 0.9

并注意usd_to_euro的签名是

val usd_to_euro : (float -> float)

因此,如果我们给它一个浮点值,它将返回另一个浮点值。 我们给它的价值是美元的价值

let dollar = 10.0

我们就像

一样使用它
let euro = usd_to_euro dollar
printfn "Dollar: %A to Euro: %A" dollar euro

给出了

Dollar: 10.0 to Euro: 9.0

这就是我们想要的。

现在为所有汇率做这件事

let create_exchange_functions (usd_to_euro_rate, usd_to_yuan_rate, usd_to_peso_rate, usd_to_pound_rate, usd_to_ruble_rate) = 
    let toEuro dollar = usd_to_euro_rate * dollar
    let toYuan dollar = usd_to_yuan_rate * dollar
    let toPeso dollar = usd_to_peso_rate * dollar
    let toPound dollar = usd_to_pound_rate * dollar
    let toRuble dollar = usd_to_ruble_rate * dollar
    (toEuro, toYuan, toPeso, toPound, toRuble)

let (usd_to_euro, usd_to_yuan, usd_to_peso, usd_to_pound, usd_to_ruble) = 
    create_exchange_functions(0.9, 4., 3., 0.6, 5.)

let dollar = 10.0
let pound = usd_to_pound dollar
printfn "Monday - Dollar: %A to Pound: %A" dollar pound

Monday - Dollar: 10.0 to Pound: 6.0

let (usd_to_euro, usd_to_yuan, usd_to_peso, usd_to_pound, usd_to_ruble) = 
    create_exchange_functions(0.92, 3.8, 3., 0.65, 5.)

let pound = usd_to_pound dollar
printfn "Tuesday - Dollar: %A to Pound: %A" dollar pound

Tuesday - Dollar: 10.0 to Pound: 6.5