如何在一种记录类型或功能中制定配方

时间:2019-01-16 02:16:23

标签: f#

我希望能够以多种方式表达某种特定类型的Measure。这是一个非常古怪的例子。

  
      
  1. 如果我们正在煮羔羊肉,那么我们将需要3汤匙橄榄油,1杯糖和3盎司黄油。
  2.   
  3. 如果我们正在做馅饼,那么我们将需要10汤匙橄榄油和1盎司盐
  4.   
  5. 如果我们要烹饪牛排,那么我们将需要5盎司盐,4磅冰淇淋。
  6.   

我有不同的测量方法:

[<Measure>] type Tablespoon
[<Measure>] type Ounce
[<Measure>] type Pounds

我们还有要烹饪的不同食物:

type Foods = 
    | Lamb
    | Pie
    | Steak

我们如何创建记录/函数/某些东西来代表上面的配方?

我正在尝试对类似的东西进行建模:

  

随附产品的衡量标准是什么?随行   献给公羊或母羊的是细面粉的isaron12   用四分之一的一分之十三的油和一四分之一的酒作为   葡萄酒解放。这些也是山羊的[附带产品]   不论是小型的还是大型的15,无论是雌雄,还是母羊,   即使她很大。但是,公羊随附的产品   是两个esronim混合了三分之一的石油和三分之一的石油   酒之欣为解放。牛或牲畜的配套产品   小牛,不论是雄性还是雌性,都是将三个伊斯洛宁(sronim)与一半的   解放了油的一欣和酒的一半。

随动物的种类(绵羊/山羊/公羊)而不同,每种随行的动物也不同。

1 个答案:

答案 0 :(得分:3)

为满足您的需要,我可能使用F#的度量单位系统,而是将您的单位建模为有区别的联合。原因是因为F#的度量单位被视为完全不同的类型,所以您无法编写类似[ 3.0<Tablespoon>; 0.5<Cup> ]的列表,因为F#会引发类型错误。但是,您可以执行以下操作:

type RecipeUnit =
    | Tablespoon
    | Cup
    | Ounce
    | Pound

type Ingredient =
    | Butter
    | OliveOil
    | Sugar
    | Salt

type RecipePart = { Amount: float
                    Unit: RecipeUnit
                    Item: Ingredient }

let pie = [
    { Amount = 10.0; Unit = Tablespoon; Item = OliveOil }
    { Amount = 1.0; Unit = Ounce; Item = Salt }
]

或者,以您的实际数据模型为例:

type Unit =
    | Isaron
    | Hin

type Ingredient =
    | Flour
    | Oil
    | Wine

type OfferingPart = { Amount: float
                      Unit: Unit
                      Item: Ingredient }
type Offering = OfferingPart list

let sheepOffering = [
    { Amount = 1.0; Unit = Isaron; Item = Flour }
    { Amount = 1.0 / 4.0; Unit = Hin; Item = Oil }
    { Amount = 1.0 / 4.0; Unit = Hin; Item = Wine }
]

let goatOffering = sheepOffering

let ramOffering = [
    { Amount = 2.0; Unit = Isaron; Item = Flour }
    { Amount = 1.0 / 3.0; Unit = Hin; Item = Oil }
    { Amount = 1.0 / 3.0; Unit = Hin; Item = Wine }
]

// Etc.

请注意,1.0 / 3.0是不精确的;如果这是一个问题,则需要对有理分数建模(作为元组或2项记录;我假设您不需要这方面的帮助)。

P.S。我假设“ esronim”是“ isaron”的复数,并且在公羊祭中提到的两个esronim是面粉。如果我错了,请相应调整示例。