2016-01-20 7 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) = 
    (??, ??, ??, ....??); 

// утром дня х я запускаю это:

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

почему беспорядок это в огромных кортежей? - Очевидно, что вы можете сделать это за один такт, например «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. Это то, что делает карри. Это позволяет нам создавать функцию, которая нуждается в параметре, и параметр может быть указан последним. Поэтому давайте посмотрим, как это делается.

Кулак создать функцию 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 
+0

Также взгляните на [Частичное приложение] (https://en.wikipedia.org/wiki/Partial_application) –

Смежные вопросы