有没有更好的方法来编写下面的 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) 应如何处理,但对于其他情况,您可以执行以下操作:

let addValues v1 v2 =
    match v1, v2 with
    | Tag1 d1, Tag1 d2 -> Tag1 (d1 + d2)
    | Tag2 d1, Tag2 d2 -> Tag2 (d1 + d2)
    | Error e1, Error e2 -> //???
    | _ -> Error "Mixed Tags"

关于f# - 从现有的工会案例创建新的工会案例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42122462/

10-09 09:50