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