正如@s952163 指出的那样,您似乎正在尝试从数据库中读取数据,在这种情况下,有比自己尝试更好的选择。不过,如果从表面上看 OP,只是为了勾勒出一个可能的解决方案,这是一种解决方法。
由于列出的类型不是 .NET 类型,也许最好定义一个自定义类型来保存这些值:
open System
type DbType = NVarChar of string | DT of DateTime
如果您愿意,可以向DbType 添加更多案例。
使用active patterns,您可以编写一个函数来转换单个候选:
// string * string -> string option
let (|NVarChar|_|) = function
| "nvarchar", (x : string) -> Some x
| _ -> None
// string * string -> DateTime option
let (|DT|_|) (typeHint, value) =
match (typeHint, DateTime.TryParse value) with
| "date", (true, dt) -> Some dt
| _ -> None
// string * string -> DbType option
let convertPair = function
| NVarChar x -> Some (NVarChar x)
| DT x -> Some (DT x)
| _ -> None
使用活动模式并不是绝对必要的,但我认为它使我能够很好地分解问题。
现在您可以声明类型列表和值之一,将它们压缩在一起以获得解释值列表:
> let types = ["nvarchar"; "nvarchar"; "date"; "nvarchar"];;
val types : string list = ["nvarchar"; "nvarchar"; "date"; "nvarchar"]
> let values = ["Jackson"; "Sentzke"; "1991-04-19T00:00:00"; "Jackson Sentske"];;
val values : string list =
["Jackson"; "Sentzke"; "1991-04-19T00:00:00"; "Jackson Sentske"]
> let converted = List.zip types values |> List.choose convertPair;;
val converted : DbType list =
[NVarChar "Jackson"; NVarChar "Sentzke"; DT 19.04.1991 00:00:00;
NVarChar "Jackson Sentske"]
请注意,types 和 values 都具有 string list 类型。在 OP 中,它们是 (string * string * string * string) list,我认为这是一个错误。