Когда НЕ следует использовать единицы измерения?
Я считаю, что к любым значениям, которые используются в расчетах, должна применяться единица измерения.
Верны ли мои мысли?
Если да, то почему F # по умолчанию не применяет это ограничение для поощрения правильности?
В моем случае я использовал единицы измерения для баскетбольного матча:
Например:
[<Measure>] type pts
type Player = { Score:int<pts> }
Вот модель, в которой используются единицы измерения:
(*Types*)
[<Measure>] type pts
type Player = { Score:int<pts> }
type FieldShot = TwoPointer| ThreePointer
type FoulShots = FoulShot | TwoFoulShots | ThreeFoulShots
type FoulShooter = FoulShooter of Player
type FieldShooter = FieldShooter of Player
(*Functions*)
let shoot (lastShot:int<pts>) player =
(player.Score + lastShot)
let fieldShot (fieldShooter, shot) =
let player = match fieldShooter with
| FieldShooter player -> player
match player.Score with
| score when score > 10<pts> -> score
| _ -> match (fieldShooter, shot) with
| FieldShooter player, shot -> match shot with
| TwoPointer -> player |> shoot 2<pts>
| ThreePointer -> player |> shoot 3<pts>
let foulShot (foulShooter, shot) =
let player = match foulShooter with
| FoulShooter player -> player
match player.Score with
| score when score >= 11<pts> -> score
| _ -> match (foulShooter, shot) with
| FoulShooter player, shot -> match shot with
| FoulShot -> player |> shoot 1<pts>
| TwoFoulShots -> player |> shoot 2<pts>
| ThreeFoulShots -> player |> shoot 3<pts>
let makeFoulShots foulShots (shooter, defender) =
FieldShooter { Score= foulShot (shooter, foulShots) }, defender
let makeFieldShot fieldBasket (shooter, defender) =
FoulShooter { Score= fieldShot (shooter, fieldBasket) }, defender
let turnover (shooter, defender) = (defender, shooter)
(*Client*)
let player1, player2 = FieldShooter { Score=0<pts> } ,
FieldShooter { Score=0<pts> }
let results = (player1, player2) |> makeFieldShot TwoPointer
|> makeFoulShots ThreeFoulShots
|> makeFieldShot TwoPointer
|> makeFoulShots TwoFoulShots
|> makeFieldShot TwoPointer
|> makeFoulShots FoulShot
<pts>
и заменить на<_>
. В более реалистичном коде вы даже не будете часто видеть<_>
. Я должен признать, что я большой поклонник единиц измерения (я поддерживаю огромную базу кода F #), и единицы спасали положение в бесчисленных случаях. - person Anton Schwaighofer   schedule 13.04.2016