以下のaddValues
関数を書く方が良いでしょうか?それは、FSharp.Reflectionではなくパターンマッチングを使用することが可能になるはずですが、私はそれを見ることができません。既存のケースから新しいユニオンケースを作成する
open System
open FSharp.Reflection
type Value =
| Tag1 of decimal
| Tag2 of decimal
| Error of string
let addValues v1 v2 =
let c1, f1 = FSharpValue.GetUnionFields(v1, v1.GetType())
let c2, f2 = FSharpValue.GetUnionFields(v2, v2.GetType())
let amt1 = (f1.[0]) :?> decimal
let amt2 = (f2.[0]) :?> decimal
if c1 = c2
then ((FSharpValue.MakeUnion(c1, [|box (amt1 + amt2)|]))) :?> Value
else Error "Mixed Tags"
これがそうのように使用することができます。
addValues (Tag1 22m) (Tag1 10m) //Value = Tag1 32M
addValues (Tag1 22m) (Tag2 10m) //Value = Error "Mixed Tags"
'addValues(Error" e1 ")(Error" e2 ")'ではどうなるでしょうか? – Lee
このタイプに 'Error'が必要ですか? –
この場合、私にとっては、['Choice <'T1,'T2>'](https://msdn.microsoft.com/visualfsharpdocs/conceptual/core.choice%5B%27t1%2C%27t2%5D-union-%5Bfsharp% 5D)または多分 'Option' –