Есть ли лучший способ написать функцию 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 (ошибка« e1 ») (ошибка« e2 »)'? – Lee
Вы уверены, что вам нужен 'Error' в этом типе? –
только для меня в этом случае лучше использовать ['Choice <'T1,'T2>'] (https://msdn.microsoft.com/visualfsharpdocs/conceptual/core.choice%5B%27t1%2C%27t2%5D-union-%5Bfsharp% 5D) или, может быть, 'Option' –