2016-01-20 91 views
2

我只想說「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.; 

//日上午我運行這個:

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

爲什麼搞砸了巨大的元組? - 顯然你可以用'let inline exchange rate input = input * rate'這樣的速率做一個匯率,然後用'let exchangeFuns = rates |> List.map exchange'將一個匯率列表映射到一個交換函數列表中。 – Carsten

+2

如果你使用度量單位 – Carsten

+0

,那麼這可以是非常可讀和非常安全*我試圖用列表函數來解決這個問題。試圖更好地理解更基本的東西。 – fractal

回答

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的值。這就是柯里里正在做的事情。它允許我們創建需要參數的函數,並且參數可以由後者提供。所以讓我們看看這是如何完成的。

拳利用create_exchange_functions

let usd_to_euro = create_exchange_functions 0.9 

創建函數usd_to_eruo和注意的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 
+0

另請參閱[部分應用](https://en.wikipedia.org/wiki/Partial_application) –