好吧,奇怪的问题来了。我FSharp.Data.SqlClient
用来从我们的数据库中获取记录。它推断的记录有几个选项类型的字段。我需要过滤掉 ANY 选项类型为 None 的记录,并创建已知字段的新记录。下面是我所说的一个例子。为了解决这个问题,我创建了一个过滤函数 ,它在所有类型都包含值recordFilter
的情况下返回我想要的类型,而当它们不包含值时返回。Option<'T>
None
我的问题是是否可以创建一个函数来自动检查Option<'T>
记录中的所有字段是否具有值。我猜这需要某种反射来遍历记录的字段。我猜这是不可能的,但我想把它扔出去以防我错了。
如果这种方法是惯用的方法,那么我会很高兴听到这一点。我只是想确保我不会错过一些更优雅的解决方案。F# 的可能性总是让我感到惊讶。
我的动机是我正在处理具有数十个字段类型的记录Option<'T>
。match...with
像我在这个例子中所做的那样,必须写出大量的语句是很烦人的。当只有几个字段时很好,当它是 30+ 字段时,很烦人。
type OptionRecord = {
Id: int
Attr1: int option
Attr2: int option
Attr3: int option
Attr4: int option
Attr5: int option
Attr6: int option
}
type FilteredRecord = {
Id: int
Attr1: int
Attr2: int
Attr3: int
Attr4: int
Attr5: int
Attr6: int
}
let optionRecords = [for i in 1..5 ->
{
OptionRecord.Id = i
Attr1 = Some i
Attr2 =
match i % 2 = 0 with
| true -> Some i
| false -> None
Attr3 = Some i
Attr4 = Some i
Attr5 = Some i
Attr6 = Some i
}]
let recordFilter (x:OptionRecord) =
match x.Attr1, x.Attr2, x.Attr3, x.Attr4, x.Attr5, x.Attr6 with
| Some attr1, Some attr2, Some attr3, Some attr4, Some attr5, Some attr6 ->
Some {
FilteredRecord.Id = x.Id
Attr1 = attr1
Attr2 = attr2
Attr3 = attr3
Attr4 = attr4
Attr5 = attr5
Attr6 = attr6
}
| _, _, _, _, _, _ -> None
let filteredRecords =
optionRecords
|> List.choose recordFilter