Вы можете создать новые значения регистра объединения, основываясь на существующем значении того же регистра объединения, используя Reflection. Чтобы добиться этого, просто добавьте элемент экземпляра Same
в ваш дискриминируемый союз, который сначала выводит конкретный случай объединения из экземпляра self
, а затем создает новый экземпляр по тому же случаю объединения, но теперь заполняется newVal
:
open Microsoft.FSharp.Reflection
type Currency =
| Dollar of int
| Euro of int
member self.Same newVal : Currency =
FSharpValue.MakeUnion(fst (FSharpValue.GetUnionFields(self,
typeof<Currency>)), [|newVal|])
|> unbox
Теперь применяем его к lowPrice
значению ниже
let lowPrice = Euro(100)
let highPrice = lowPrice.Same 200
вы получите highPrice : Currency = Euro 200