如何制作value_of_things函数f#

时间:2016-01-20 20:40:32

标签: f# f#-interactive f#-3.0

嘿伙计们让我说我有一个功能可以获得当天的费用,以英镑为单位,并将其乘以客户想要的重量。即

String[] projection = {"*"};

List<String> data = new ArrayList<>();

Cursor cursor = context.getContentResolver().query(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, null, null, null);

if(cursor.moveToFirst()) {
    do {
        data.add(cursor.getString(cursor
                        .getColumnIndex(MediaStore.Images.Media.DATA)));
    } while(cursor.moveToNext());
}

然后我的输出将是38(因为3.8美元* 10磅)= 38美元 我尝试做if语句,以便当用户只想找出一件事的总成本而不是两者。但我不断收到错误。我无法弄清楚如何在参数中存储速率值然后调用该函数。 这是我试过的

let convert_func (crab_rate, lobster_rate);

//and then on a certain day it is
 let (crab_rate, lobster_rate) = convert_fun(3.4, 6.8); // $3.8 a pound for crab, $6.8 a pound for lobster.
// 10 being how many pounds i want.
crab_rate10 ;

1 个答案:

答案 0 :(得分:0)

我认为你应该从制定将成本/重量和重量转换为成本的一般功能开始。在F#中,您甚至可以使用度量单位来帮助您:

[<Measure>] type USD // Unit of measure: US Dollars
[<Measure>] type lb // Unit of measure: lbs

let priceForWeight rate (weight : float<lb>) : float<USD> =
    rate * weight

使用curried参数的函数式语言的好处是我们可以轻松地使用部分函数应用程序。这意味着当我们有一个具有两个参数的函数时,我们可以选择只提供一个参数,并从结果的剩余参数中获取一个新函数。

因此,我们可以定义另一对使用此priceForWeight函数的函数。

let crabPriceForWeight weight = priceForWeight 3.8<USD/lb> weight
let lobsterPriceForWeight weight = priceForWeight 6.8<USD/lb> weight

请注意,我们使用原始函数来定义两个具有固定速率的新函数。

我们可以像这样评估它:

let crabPrice10 = crabPriceForWeight 10.0<lb> // result 38.0<USD>

当然,您还可以定义一个函数,将两个价格一起作为提供权重的元组返回:

let crabAndLobsterPriceForWeight weight = 
    crabPriceForWeight weight, lobsterPriceForWeight weight