我正在编写一个程序,在该程序中,我必须将一些 obj 类型的输入验证为数字类型。基本上,我正在寻找编写函数
validateint : obj -> int option
validatefloat : obj -> float option
... and so on
这本身不是问题,例如,例如我得到了类似的东西:
let validateint x =
match x with
| y when y.GetType() = typeof<int> -> y :?> int |> Some
| y when y.GetType() = typeof<float> -> y :?> float |> int |> Some
| y when y.GetType() = typeof<System.Int16> -> y :?> System.Int16 |> int |> Some
/// ...more numeric cases
| _ -> None
但是,在为 validateint 编写了类似的代码之后,我想考虑出一个将转换函数作为输入的函数,例如:
let validatenumeric cast x =
match x with
| y when y.GetType() = typeof<int> -> y :?> int |> cast |> Some
| y when y.GetType() = typeof<float> -> y :?> float |> cast |> Some
| y when y.GetType() = typeof<System.Int16> -> y :?> System.Int16 |> cast |> Some
/// ...more numeric cases
| _ -> None
然后定义
let validateint = validatenumeric int
let validatefloat = validatenumeric float
...
但是,这不起作用,因为 F# 基本上将强制转换的类型推断为 int -> 'a ,然后第二个和以后的匹配情况输入错误。我想我可以通过为每个数字类型添加一个额外的强制转换为浮点数来避免这种情况,但这感觉就像一个丑陋的黑客。有没有更优雅的解决方案?