有没有更好的方法来编写下面的 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/