как сформулировать рецепт в 1 тип записи или функции - PullRequest
0 голосов
/ 16 января 2019

Я хотел бы иметь возможность выразить некоторые Measure определенного типа различными способами. Это очень дурацкий пример.

  1. Если мы готовим ягненка, нам понадобится 3 столовые ложки оливкового масла, 1 чашка сахара и 3 унции масла.
  2. Если мы готовим пирог, нам понадобится 10 столовых ложек оливкового масла и 1 унция соли
  3. Если мы приготовим стейк на площади, нам понадобится 5 унций соли, 4 фунта мороженого.

У меня есть разные меры:

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

У нас также есть разные продукты, которые мы хотели бы приготовить:

type Foods = 
    | Lamb
    | Pie
    | Steak

Как мы можем создать запись / функцию / что-то, чтобы представить рецепт выше?

Я пытаюсь смоделировать что-то вроде этого:

Какова мера сопутствующих предложений? Сопровождающий предложение для овец мужского или женского пола isaron12 из тонкой муки смешанного с четвертью хин13 масла и четвертью хина вина как вино вино. Это также [сопутствующие предложения] для козла будь то маленький14 или большой15, будь то мужчина или женщина и для овцы, даже если она большая. Сопутствующие предложения барана, однако, два эсронима, смешанные с третью гина масла и третью вино как возлияние. Сопутствующие предложения коровы или Теленок, будь то самец или самка, - это три эсронима, смешанные с половиной хин масла и половина хина вина как возлияние.

Каждое сопровождающее предложение отличается в зависимости от предлагаемого животного (овца / коза / баран).

1 Ответ

0 голосов
/ 16 января 2019

Для ваших нужд я мог бы не использовать систему единиц измерения 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 неточно; если это проблема, вы захотите смоделировать рациональные дроби (в виде записи кортежа или записи из двух элементов; я полагаю, вам не нужна помощь с этим).

P.S. Я предполагаю, что «эсроним» - это множественное число от «изарон», и что два эсронима, упомянутые в предложении барана, - из муки. Если я ошибся, исправьте мой пример соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...