, map , , , , map , . , .
, , , , Money:
[<Measure>] type Money
, map, , decimal<Money> -> decimal<Money>. USD EUR, -, map. USD EUR Money f, :
let map (f : decimal<Money> -> decimal<Money>) input =
match input with
| CurrencyUsd x -> CurrencyUsd((f (x * 1M<Money/USD>)) * 1M<USD/Money>)
| CurrencyEur x -> CurrencyEur((f (x * 1M<Money/EUR>)) * 1M<EUR/Money>)
, , . m + m, , - , m * m, :
CurrencyUsd(10.M<_>) |> map (fun m -> m + m)
CurrencyUsd(10.M<_>) |> map (fun m -> m * m)
, :
type Mapper =
abstract Apply<[<Measure>] 'm> : decimal<'m> -> decimal<'m>
let map (f : Mapper) input =
match input with
| CurrencyUsd x -> CurrencyUsd(f.Apply x)
| CurrencyEur x -> CurrencyEur(f.Apply x)
CurrencyUsd(10.M<_>) |> map { new Mapper with member x.Apply m = m + m }
CurrencyUsd(10.M<_>) |> map { new Mapper with member x.Apply m = m * m }