 <p>You can make new union case values based on existing value of the same union case using Reflection. In order to achieve this just add instance member <code>Same</code> to your discriminated union, which first derives specific union case from the instance <code>self</code> and then constructs a new instance by the same union case, but now populated with <code>newVal</code>:</p> <pre><code>open Microsoft.FSharp.Reflection type Currency = | Dollar of int | Euro of int member self.Same newVal : Currency = FSharpValue.MakeUnion(fst (FSharpValue.GetUnionFields(self, typeof&lt;Currency&gt;)), [|newVal|]) |&gt; unbox </code></pre> <p>Now applying it to <code>lowPrice</code> value below</p> <pre><code>let lowPrice = Euro(100) let highPrice = lowPrice.Same 200 </code></pre> <p>you'll get <code>highPrice : Currency = Euro 200</code></p>